gpt4 book ai didi

python - 如何将 numpy 数组转换为形式 ((value0, row0, column0), (value1, row0, column1)...)?

转载 作者:行者123 更新时间:2023-12-04 00:54:14 28 4
gpt4 key购买 nike

如何将numpy数组转换成((value0, row0, column0), (value1, row0, column1)...)这样的形式?例如如果输入是

a = np.array([[10, 15],
[20, 25]])

输出应该是:((10, 0, 0), (15, 0, 1), (20, 1, 0), (25, 1, 1))。此外,该函数应该能够应用于常量、1D、3D、4D 等数组,例如对于 4D,输出应该是 (value0, dim1, dim2, dim3, dim4)。我只能为特定维度创建这样的函数,例如仅适用于 2D。

最佳答案

这是基于 np.indices 的 n 维数组的向量化数组-

def stack_indices(a):
i = np.moveaxis(np.indices(a.shape),0,-1)
return np.concatenate((a[...,None],i),axis=-1)

样本运行-

1D:

In [70]: a = np.array([4,5,2])

In [71]: stack_indices(a)
Out[71]:
array([[4, 0],
[5, 1],
[2, 2]])

二维:

In [62]: a
Out[62]:
array([[10, 15, 17],
[20, 25, 30]])

In [63]: stack_indices(a)
Out[63]:
array([[[10, 0, 0],
[15, 0, 1],
[17, 0, 2]],

[[20, 1, 0],
[25, 1, 1],
[30, 1, 2]]])

3D:

In [68]: a
Out[68]:
array([[[51, 67],
[45, 21],
[56, 92]],

[[10, 24],
[63, 22],
[52, 94]]])

In [69]: stack_indices(a)
Out[69]:
array([[[[51, 0, 0, 0],
[67, 0, 0, 1]],

[[45, 0, 1, 0],
[21, 0, 1, 1]],

[[56, 0, 2, 0],
[92, 0, 2, 1]]],


[[[10, 1, 0, 0],
[24, 1, 0, 1]],

[[63, 1, 1, 0],
[22, 1, 1, 1]],

[[52, 1, 2, 0],
[94, 1, 2, 1]]]])

基准测试

其他发布的方法:

from itertools import product

# @Quang Hoang's soln
def prod(a):
return [(u,)+ v for u,v in zip(a.ravel(), product(*[np.arange(x) for x in a.shape]) )]

# @Andy L.'s soln
def ravel(a):
return [z for z in zip(a.ravel(), *np.unravel_index(np.arange(a.size), a.shape))]

使用 benchit包(几个基准测试工具打包在一起;免责声明:我是它的作者)来基准测试建议的解决方案。

import benchit
funcs = [stack_indices, prod, ravel]
in_ = [np.random.randint(10,100,([5]*n)) for n in range(1,10)]
t = benchit.timings(funcs, in_, indexby='shape')
t.rank()
t.plot(logx=False, save='timings.png', rot=90)

enter image description here

为了在高维数组上获得更好的性能,我想可以研究一下数组赋值。

关于python - 如何将 numpy 数组转换为形式 ((value0, row0, column0), (value1, row0, column1)...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63960398/

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