簡體   English   中英

從 Numpy 中的多個切片中選擇

[英]Select from multiple slices in Numpy

說我們有

a = np.ones((3,3,3))

slices = [(0, 1, slice(None)), (0, slice(None), 0),  (slice(None), 1, 0)]

有一個簡單的方法來選擇/變化值aslices

例如,我要指派0a下切片這樣a

array([[[0., 1., 1.],
        [0., 0., 0.],
        [0., 1., 1.]],

       [[1., 1., 1.],
        [0., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [0., 1., 1.],
        [1., 1., 1.]]])

迭代的方法是做

for t in slices:
    a[t] = 0

有沒有更好的方法來使用像np.r_這樣的索引,就像 JoshAdel 在將值分配給 numpy 中的多個切片中使用的那樣?

我希望能達到像a[SLICES] = 0 ,改變的一部分a從每個切片slices0

你知道r_是做什么的嗎? 它將切片轉換為范圍,然后將整個混亂連接在一起。

我不知道您是否可以使用r_或類似的東西來構建所需的索引。 但:

In [168]: idx = np.where(a==0)
In [169]: idx
Out[169]: 
(array([0, 0, 0, 0, 0, 1, 2]),
 array([0, 1, 1, 1, 2, 1, 1]),
 array([0, 0, 1, 2, 0, 0, 0]))

這讓我們了解所需的索引數組(減去一些可能的重復項)。


可以將這 3 個ogrid列表連接成一個組合:

In [181]: np.ogrid[0:1,1:2,:3]
Out[181]: [array([[[0]]]), array([[[1]]]), array([[[0, 1, 2]]])]

In [182]: np.ogrid[0:1,:3,0:1]
Out[182]: 
[array([[[0]]]), array([[[0],
         [1],
         [2]]]), array([[[0]]])]

In [183]: np.ogrid[:3,1:2,0:1]
Out[183]: 
[array([[[0]],

        [[1]],

        [[2]]]), array([[[1]]]), array([[[0]]])]

他們單獨選擇 0 中a .

將它們轉換為它們的等價物並加入生成的一維數組可能是最簡單的。

In [188]: np.ravel_multi_index(Out[181],(3,3,3))
Out[188]: array([[[3, 4, 5]]])
etc
In [195]: np.hstack([Out[188].ravel(), Out[189].ravel(), Out[190].ravel()])
Out[195]: array([ 3,  4,  5,  0,  3,  6,  3, 12, 21])
In [197]: a.flat[_]
Out[197]: array([0., 0., 0., 0., 0., 0., 0., 0., 0.])

In [199]: np.unravel_index(Out[195],(3,3,3))
Out[199]: 
(array([0, 0, 0, 0, 0, 0, 0, 1, 2]),
 array([1, 1, 1, 0, 1, 2, 1, 1, 1]),
 array([0, 1, 2, 0, 0, 0, 0, 0, 0]))

Out[169]Out[199]具有相同的值,但重復項除外。

這是連接幾個一維切片問題的概括。 索引然后連接所花費的時間與先連接索引所花費的時間差不多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM