多维 ndarray 集合操作



我需要运行两个潜在的大多维numpy.ndarrays的集合差。
我的测试已被证明是不成功的,试图在不抛出以下TypeError的情况下扩展numpy.setdiff1d以适用于多维数组:

TypeError: Cannot change data-type for object array.

这些数组中的数据是长字符串。

我有以下两个数组:

A = [[0L 'a']
     [2L 'c']
     [1L 'b']
     [3L 'b']
     [0L 'd']]
B = [[1L 'b']
     [0L 'a']
     [4L 'b']]

预期结果是集合差S = A - B哪些是((0,d), (2,c), (3,b))对。

只要您进行集合比较的形状是 1d,就使用结构化数组(这里是,因为您有一个有效的 1d 对数组):

A = np.array([(0L, 'a'),
              (2L, 'c'),
              (1L, 'b'),
              (3L, 'b'),
              (0L, 'd')], dtype=[('n', long), ('l', 'S1')])
B = np.array([(1L, 'b'),
              (0L, 'a'),
              (4L, 'b')], dtype=[('n', long), ('l', 'S1')])
S = np.setdiff1d(A, B)
>>> S
array([(2L, 'c'), (3L, 'b'), (0L, 'd')], 
      dtype=[('n', '<i8'), ('l', 'S1')])

你可以在这里使用 Python 的集合操作:

In [66]: s = set(tuple(x) for x in A).difference(tuple(x) for x in B)
In [67]: np.array(list(s))
Out[67]: 
array([['0', 'd'],
       ['2', 'c'],
       ['3', 'b']], 
      dtype='|S1')

最新更新