【问题标题】:Multi-dimensional ndarray set operations多维ndarray集合操作
【发布时间】:2014-04-07 21:26:05
【问题描述】:

我需要运行两个可能较大的多维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)) 对。

【问题讨论】:

    标签: python arrays numpy multidimensional-array pandas


    【解决方案1】:

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

    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')])
    

    【讨论】:

    • 这看起来是正确的方法,但我不能像你提到的那样更改数组 dtype。我的 np.arrays 是从 Pandas .values() 方法返回的。那些的dtype是对象。我正在尝试使用 .astype 将它们转换为您建议的 dtype 但我收到以下类型错误:期望一个可读的缓冲区对象。有什么想法吗?
    • 啊,是的,有时将某些数组转换为结构化数组可能会很棘手。看看np.core.rec.fromarrays。此外,可能有一个 pandas 解决方案,因此您不必转换为 numpy。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多