如何根据条件在numpy中拆分数组?

29 投票
3 回答
34442 浏览
提问于 2025-04-17 03:43

比如,我有一个 ndarray,它是:

a = np.array([1, 3, 5, 7, 2, 4, 6, 8])

现在我想把 a 分成两部分,一部分是所有小于5的数字,另一部分是所有大于等于5的数字:

[array([1,3,2,4]), array([5,7,6,8])]

当然,我可以遍历 a 并创建两个新的数组。但我想知道 numpy 有没有更好的方法?

同样,对于多维数组,比如:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [2, 4, 7]])

我想根据第一列小于3和大于等于3来分割,结果是:

[array([[1, 2, 3],
        [2, 4, 7]]), 
 array([[4, 5, 6],
        [7, 8, 9]])]

有没有比遍历更好的方法呢?谢谢。

3 个回答

0

一维数组

a = numpy.array([2,3,4,...]) 这里我们创建了一个一维数组,里面有一些数字。接下来,a_new = a[(a < 4)] 这行代码的意思是,我们想要从这个数组中找出所有小于4的数字,结果会存放在新的数组a_new里。

二维数组,按列处理(假设我们关注的列的值应该小于5)

a = numpy.array([[1,2],[5,6],...]) 这里我们创建了一个二维数组,里面有几行几列的数字。然后,a = a[(a[:,i] < 5)] 这行代码的意思是,我们要检查第i列的所有数字,找出那些小于5的数字,并把符合条件的行保留下来。

如果你的条件涉及多列,那么你可以创建一个新的数组,应用这些条件在不同的列上。之后,你只需要把这个新数组和5进行比较(根据我的假设),就能找到符合条件的索引,然后可以使用上面的代码。请注意,括号里的内容会返回一个索引数组。

0

这可能是个快速的解决办法。

a = np.array([1,3,5,7])
b = a >= 3 # variable with condition
a[b] # to slice the array
len(a[b]) # count the elements in sliced array
47
import numpy as np

def split(arr, cond):
  return [arr[cond], arr[~cond]]

a = np.array([1,3,5,7,2,4,6,8])
print split(a, a<5)

a = np.array([[1,2,3],[4,5,6],[7,8,9],[2,4,7]])
print split(a, a[:,0]<3)

这段代码会产生如下输出:

[array([1, 3, 2, 4]), array([5, 7, 6, 8])]

[array([[1, 2, 3],
       [2, 4, 7]]), array([[4, 5, 6],
       [7, 8, 9]])]

撰写回答