gpt4 book ai didi

python - 创建 numpy 二维索引数组的最快方法

转载 作者:太空狗 更新时间:2023-10-30 02:08:18 24 4
gpt4 key购买 nike

我想创建一个包含单元格索引的 numpy 二维数组,例如可以使用以下方法创建这样的 2x2 垫:

np.array([[[0,0],[0,1]],[[1,0],[1,1]]])

换句话说,索引 i,j 处的单元格应包含列表 [i,j]

我可以制作一个嵌套循环以 c 方式执行此操作,但我想知道是否有一种快速的 pythonic 方式来执行此操作?

最佳答案

对于 NumPy 的性能,我建议使用基于数组初始化的方法 -

def indices_array(n):
r = np.arange(n)
out = np.empty((n,n,2),dtype=int)
out[:,:,0] = r[:,None]
out[:,:,1] = r
return out

对于通用的 (m,n,2) 形状的输出,我们需要进行一些修改:

def indices_array_generic(m,n):
r0 = np.arange(m) # Or r0,r1 = np.ogrid[:m,:n], out[:,:,0] = r0
r1 = np.arange(n)
out = np.empty((m,n,2),dtype=int)
out[:,:,0] = r0[:,None]
out[:,:,1] = r1
return out

注意:此外,请阅读本文后面的 2019 附录,了解性能。使用较大的 mn 进行提升。

sample 运行-

In [145]: n = 3

In [146]: indices_array(n)
Out[146]:
array([[[0, 0],
[0, 1],
[0, 2]],

[[1, 0],
[1, 1],
[1, 2]],

[[2, 0],
[2, 1],
[2, 2]]])

如果您需要一个22D 数组,只需 reshape -

In [147]: indices_array(n).reshape(-1,2)
Out[147]:
array([[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2]])

时间和验证-

In [141]: n = 100   
...: out1 = np.array(list(product(range(n), repeat=2))).reshape(n,n,2)
...: out2 = indices_array(n)
...: print np.allclose(out1, out2)
...:
True

# @Ofek Ron's solution
In [26]: %timeit np.array(list(product(range(n), repeat=2))).reshape(n,n,2)
100 loops, best of 3: 2.69 ms per loop

In [27]: # @Brad Solomon's soln
...: def ndindex_app(n):
...: row, col = n,n
...: return np.array(list(np.ndindex((row, col)))).reshape(row, col, 2)
...:

# @Brad Solomon's soln
In [28]: %timeit ndindex_app(n)
100 loops, best of 3: 5.72 ms per loop

# Proposed earlier in this post
In [29]: %timeit indices_array(n)
100000 loops, best of 3: 12.1 µs per loop

In [30]: 2690/12.1
Out[30]: 222.31404958677686

200x+ 使用基于初始化的方法,n=100 的速度提高了!


2019 年附录

我们也可以使用np.indices -

def indices_array_generic_builtin(m,n):
return np.indices((m,n)).transpose(1,2,0)

时间 -

In [115]: %timeit indices_array_generic(1000,1000)
...: %timeit indices_array_generic_builtin(1000,1000)
100 loops, best of 3: 2.92 ms per loop
1000 loops, best of 3: 1.37 ms per loop

关于python - 创建 numpy 二维索引数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com