使用2D值和索引数组为numpy的2D数组赋值

6

我的目标是使用两个相同形状的二维数组,一个带有值,另一个带有索引来分配对应的值,以便将现有的二维数组赋值或创建一个新数组。

X = np.array([range(5),range(5)])
X
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])

Y= np.array([range(5), [2,3,4,1,0]])
Y
array([[0, 1, 2, 3, 4],
       [2, 3, 4, 1, 0]])

我希望的结果是一个和X和Y形状相同的数组,其中X的值在相应行中给出的索引中。可以通过以下方式循环遍历每一行来获得此结果:

output = np.zeros(X.shape)

for i in range(X.shape[0]):
    output[i][Y[i]] = X[i]
output 
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 4.,  3.,  0.,  1.,  2.]])

有没有更有效的方法来应用这种类型的分配?
np.take(output, Y) 

我希望将输出数组中的项目分配给X的值,但我认为np.take不会产生对原始数组的引用,而是产生一个新数组。


这可以通过scipy中的稀疏矩阵定义来完成。请查看https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.coo_matrix.html#scipy.sparse.coo_matrix中的coo_matrix定义。 - Bort
1个回答

6
for i in range(X.shape[0]):
    output[i][Y[i]] = X[i]

等同于

I = np.arange(X.shape[0])[:, np.newaxis]
output[I, Y] = X

例如,
X = np.array([range(5),range(5)])
Y = np.array([range(5), [2,3,4,1,0]])
output = np.zeros(X.shape)
I = np.arange(X.shape[0])[:, np.newaxis]
output[I, Y] = X

产量
>>> output
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 4.,  3.,  0.,  1.,  2.]])

当循环次数较少时,性能差异不大。 但如果X.shape[0]很大,则使用索引速度更快:

def using_loop(X, Y):
    output = np.zeros(X.shape)
    for i in range(X.shape[0]):
        output[i][Y[i]] = X[i]
    return output

def using_indexing(X, Y):
    output = np.zeros(X.shape)
    I = np.arange(X.shape[0])[:, np.newaxis]
    output[I, Y] = X
    return output

X2 = np.tile(X, (100,1))
Y2 = np.tile(Y, (100,1))

In [77]: %timeit using_loop(X2, Y2)
1000 loops, best of 3: 376 µs per loop

In [78]: %timeit using_indexing(X2, Y2)
100000 loops, best of 3: 15.2 µs per loop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接