[英]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.