具有 2D 值和索引数组的 numpy 2D 数组赋值

Rya*_*yan 6 python arrays sorting indexing numpy

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

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]])
Run Code Online (Sandbox Code Playgroud)

我想要的输出是与 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.]])
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法来应用此类作业?

np.take(output, Y) 
Run Code Online (Sandbox Code Playgroud)

将返回输出数组中我想分配给 X 的值的项目,但我相信 np.take 不会生成对原始数组的引用,而是生成一个新数组。

unu*_*tbu 6

for i in range(X.shape[0]):\n    output[i][Y[i]] = X[i]\n
Run Code Online (Sandbox Code Playgroud)\n\n

相当于

\n\n
I = np.arange(X.shape[0])[:, np.newaxis]\noutput[I, Y] = X\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

例如,

\n\n
X = np.array([range(5),range(5)])\nY = np.array([range(5), [2,3,4,1,0]])\noutput = np.zeros(X.shape)\nI = np.arange(X.shape[0])[:, np.newaxis]\noutput[I, Y] = X\n
Run Code Online (Sandbox Code Playgroud)\n\n

产量

\n\n
>>> output\narray([[ 0.,  1.,  2.,  3.,  4.],\n       [ 4.,  3.,  0.,  1.,  2.]])\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

当循环迭代次数很少时,性能没有太大差异。\n但如果X.shape[0]很大,则使用索引会快得多:

\n\n
def using_loop(X, Y):\n    output = np.zeros(X.shape)\n    for i in range(X.shape[0]):\n        output[i][Y[i]] = X[i]\n    return output\n\ndef using_indexing(X, Y):\n    output = np.zeros(X.shape)\n    I = np.arange(X.shape[0])[:, np.newaxis]\n    output[I, Y] = X\n    return output\n\nX2 = np.tile(X, (100,1))\nY2 = np.tile(Y, (100,1))\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n
In [77]: %timeit using_loop(X2, Y2)\n1000 loops, best of 3: 376 \xc2\xb5s per loop\n\nIn [78]: %timeit using_indexing(X2, Y2)\n100000 loops, best of 3: 15.2 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n