多维ndarray设置操作

时间:2014-04-07 21:26:05

标签: python arrays numpy multidimensional-array pandas

我需要运行两个可能很大的多维numpy.ndarrays的集合差异 我的测试证明试图将numpy.setdiff1d扩展为多维数组而不抛出以下TypeError是不成功的:

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))对。

2 个答案:

答案 0 :(得分:1)

使用结构化数组,只要你进行设置比较的形状是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')])

答案 1 :(得分:0)

您可以在此处使用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')