繁体   English   中英

N维NumPy数组的任意N维重复

[英]Arbitrary N-dimensional repeat of N-dimensional numpy array

假设您有以下N维数组

>>> import numpy as np
>>> Z = np.array(7*[6*[5*[4*[3*[range(2)]]]]])
>>> Z.ndim
6

请注意, N = 6,但我想在讨论中将其设为任意。


然后,我执行多轴操作-当然是主观地- 有问题地 “折叠”(如此此处所述 )尺寸,并沿着这些尺寸进行计算。

假设计算的轴是

 >>> axes = (0,2,5) 

因此,元组的长度属于[ 1N ]。


正如您可能已经猜到的那样,我想使np.mean的输出形状与输入的形状相同。 例如

>>> Z.shape
(7L, 6L, 5L, 4L, 3L, 2L)

 >>> Z.shape (7L, 6L, 5L, 4L, 3L, 2L) 

我有一个自制的解决方案,如下

>>> nd_repeat(Z, Y, axes).shape
(7L, 6L, 5L, 4L, 3L, 2L)

der偶然代表“派生”。

 >>> nd_repeat(Z, Y, axes).shape (7L, 6L, 5L, 4L, 3L, 2L) 

实现此N维重复的numpy内置方式是什么?


性能问题, import timeit

 homemade_s = """\\ nd_repeat(Z, np.nanpercentile(Z, 99.9, axis=axes), axes) """ homemade_t = timeit.Timer(homemade_s, "from __main__ import nd_repeat,Z,axes,np").timeit(10000) npbuiltin_s = """\\ np.broadcast_to(np.nanpercentile(Z, 99.9, axis=axes, keepdims=True), Z.shape) """ npbuiltin_t = timeit.Timer(npbuiltin_s, "from __main__ import Z,axes,np").timeit(10000) 

不出所料

 >>> np.log(homemade_t/npbuiltin_t) 0.024082885343423521 

我的解决方案比hpaulj的解决方案慢了约2.5%。

mean具有keepdims参数,保留压缩尺寸:

In [139]: shape=(2,3,4,5)
In [140]: x=np.arange(np.prod(shape)).reshape(shape)
In [141]: m=x.mean(axis=2, keepdims=True)
In [142]: m.shape
Out[142]: (2, 3, 1, 5)

现在很容易沿该维度复制m

In [144]: m1=np.broadcast_to(m,shape)
In [145]: m1.shape
Out[145]: (2, 3, 4, 5)

repeattile也是沿着维度复制数组的便捷方法。

broadcast_to只需更改形状和步幅即可扩展数组而无需添加元素:

In [146]: m1.strides
Out[146]: (120, 40, 0, 8)

repeat增加数组的大小:

In [148]: m2=np.repeat(m, shape[2], axis=2)
In [149]: m2.shape
Out[149]: (2, 3, 4, 5)
In [150]: m2.strides
Out[150]: (480, 160, 40, 8)

m可以不使用任何一个,如xm m在这里用x广播。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM