【发布时间】:2018-01-08 20:18:27
【问题描述】:
给定两个 NumPy 数组,比如说:
import numpy as np
import numpy.random as rand
n = 1000
x = rand.binomial(n=1, p=.5, size=(n, 10))
y = rand.binomial(n=1, p=.5, size=(n, 10))
下面有没有更有效的方法来计算X:
X = np.zeros((n, n))
for i in range(n):
for j in range(n):
X[i, j] = 1 * np.all(x[i] == y[j])
【问题讨论】:
-
是的。查看broadcasting,然后尝试
(x[:, None, :] == y).all(axis=-1)。然而,这是节省时间的,但不是特别节省空间(尽管在这种特殊情况下,我们只讨论需要大约 10MB 的空间)。您主要担心空间效率还是时间效率?n在实践中会有多大? -
仅供参考:
X = np.zeros((n, n))创建的默认数据类型是浮点数。您真的希望X成为浮点值数组吗?如果您只关心相等,则可以将其设为小整数数组 (X = np.zeros((n, n), dtype=np.int8)) 或布尔值数组 (X = np.zeros((n, n), dtype=np.bool_))。 -
@MarkDickinson 我认为
n在实践中最多为10^6。 -
嗯。然后你将很难将
X放入内存,除非你有 TB 或更多或 RAM。你用X在你创建它之后做什么? -
这是一个好点...我希望
X将是一个稀疏矩阵。之后我需要使用X执行一些 mat-vec 产品。