我需要运行两个潜在的大多维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')