[英]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)
因此,元组的长度属于[ 1 , N ]。
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)
repeat
和tile
也是沿着维度复制数组的便捷方法。
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.