簡體   English   中英

如何根據一列的值將 numpy 數組拆分為子數組

[英]how to split a numpy array into subarrays based on values of one colums

我有一個大的 numpy 數組,想拆分它。 我已閱讀此解決方案,但對我沒有幫助。 目標列可以有多個值,但我知道要根據哪個值來拆分它。 在我的簡化示例中,目標列是第三列,我想根據值2.拆分它。。 這是我的陣列。

import numpy as np
big_array = np.array([[0., 10., 2.],
                      [2., 6., 2.],
                      [3., 1., 7.1],
                      [3.3, 6., 7.8],
                      [4., 5., 2.],
                      [6., 6., 2.],
                      [7., 1., 2.],
                      [8., 5., 2.1]])

具有此值 ( 2. ) 的行進行一次拆分。 然后,不是2.的下一行(第三和第四),再做一個。 再次在我的數據集中,我看到了這個值( 2. )並從中拆分出來,我再次將非2.值(最后一行)作為另一個拆分。 最終結果應如下所示:

spl_array = [np.array([[0., 10., 2.],
                       [2., 6., 2.]]),
             np.array([[3., 1., 7.1],
                      [3.3, 6., 7.8]]),
             np.array([[4., 5., 2.],
                      [6., 6., 2.],
                      [7., 1., 2.]]),
             np.array([[8., 5., 2.1]])]

在此之前,我非常感謝任何幫助。

首先,您找到所有包含 2 或不包含 2 的 arrays。該數組將充滿 True 和 False 值。 將此數組轉換為具有 0 和 1 的數組。 檢查哪里有差異(例如[0, 0, 1, 1, 0]將是: 0, 1, 0, -1

根據更改,可以使用 numpy where 找到這些值的索引。

插入索引 0 和大數組的最后一個索引,這樣您就可以在左右切片中對它們進行 zip。

import numpy as np
big_array = np.array([[0., 10., 2.],
                      [2., 6., 2.],
                      [3., 1., 7.1],
                      [3.3, 6., 7.8],
                      [4., 5., 2.],
                      [6., 6., 2.],
                      [7., 1., 2.],
                      [8., 5., 2.1]])
idx = [2 in array for array in big_array]
idx *= np.ones(len(idx))
slices = list(np.where(np.diff(idx) != 0)[0] + 1)
slices.insert(0,0)
slices.append(len(big_array))

result = list()
for left, right in zip(slices[:-1], slices[1:]):
    result.append(big_array[left:right])

'''
[array([[ 0., 10.,  2.],
        [ 2.,  6.,  2.]]),
 array([[3. , 1. , 7.1],
        [3.3, 6. , 7.8]]),
 array([[4., 5., 2.],
        [6., 6., 2.],
        [7., 1., 2.]]),
 array([[8. , 5. , 2.1]])]
'''

你可以用numpy做到這一點

np.split(
    big_array,
    np.flatnonzero(np.diff(big_array[:,2] == 2) != 0) + 1
)

Output

[array([[ 0., 10.,  2.],
        [ 2.,  6.,  2.]]),
 array([[3. , 1. , 7.1],
        [3.3, 6. , 7.8]]),
 array([[4., 5., 2.],
        [6., 6., 2.],
        [7., 1., 2.]]),
 array([[8. , 5. , 2.1]])]

暫無
暫無

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

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