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 不会生成对原始数组的引用,而是生成一个新数组。
for i in range(X.shape[0]):\n output[i][Y[i]] = X[i]\n
Run Code Online (Sandbox Code Playgroud)\n\n相当于
\n\nI = np.arange(X.shape[0])[:, np.newaxis]\noutput[I, Y] = X\n
Run Code Online (Sandbox Code Playgroud)\n\n例如,
\n\nX = 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但如果X.shape[0]
很大,则使用索引会快得多:
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\nIn [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
归档时间: |
|
查看次数: |
17944 次 |
最近记录: |