簡體   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