【问题标题】:numpy 2D array assignment with 2D value and indices arraysnumpy 二维数组赋值与二维值和索引数组
【发布时间】:2015-06-16 06:06:40
【问题描述】:

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

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 的值在 Y 中相应行的索引中给出。这个结果可以通过以下方式遍历每一行来实现:

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 不会产生对原始数组的引用,而是一个新数组。

【问题讨论】:

标签: python arrays sorting numpy indexing


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2011-07-07
    • 2017-01-29
    • 2019-07-18
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多