【问题标题】:Get unique rows from Numpy Array based on a value within the row根据行中的值从 Numpy Array 中获取唯一行
【发布时间】:2019-07-24 07:59:33
【问题描述】:

我有一个 Numpy 数组,并希望根据数组每行中第一个元素的值从它输出唯一行。我可以部分成功获取唯一行的第一个值,但不能获取完整行,例如

dataA = np.array([(107.,  7.475729,  6.573791, 90.0126 , 0.5529882, 0.867588 ),
 (107.,  7.408565,  6.38974 , 89.97312, 0.553728 , 0.8670179),
 (108.,  7.838725,  6.961871, 89.52572, 0.5610707, 0.7769735),
 (108.,  7.795123,  7.054095, 89.62989, 0.5592708, 0.7742778),
 (109.,  7.079929,  6.86194 , 89.6181 , 0.5660294, 0.8596874),
 (109.,  7.058383,  6.671512, 89.52995, 0.5663874, 0.8610857)])


print('Original Array :' , dataA)

# Get unique values from complete 2D array
uniqueValues = np.unique(dataA)

print('Unique Values : ', uniqueValues)

# Get unique rows from  numpy array
uniqueRows = np.unique(dataA[:,0], axis=0)

print('Unique Rows : ', uniqueRows, sep='\n')

这给出了:

Unique Rows : 
[107. 108. 109.]

desired results:
[(107.,  7.475729,  6.573791, 90.0126 , 0.5529882, 0.867588 ),
 (108.,  7.838725,  6.961871, 89.52572, 0.5610707, 0.7769735),
 (109.,  7.079929,  6.86194 , 89.6181 , 0.5660294, 0.8596874)])

即使上面的方法可以为我提供行 ID,但当我有 nan 时,它似乎失败了

dataA = np.array([(107.,  7.475729,  6.573791, 90.0126 , 0.5529882, 0.867588 , nan, nan)
 (107.,  7.408565,  6.38974 , 89.97312, 0.553728 , 0.8670179, nan, nan)
 (108.,  7.838725,  6.961871, 89.52572, 0.5610707, 0.7769735, nan, nan)
 (108.,  7.795123,  7.054095, 89.62989, 0.5592708, 0.7742778, nan, nan)
 (109.,  7.079929,  6.86194 , 89.6181 , 0.5660294, 0.8596874, nan, nan)
 (109.,  7.058383,  6.671512, 89.52995, 0.5663874, 0.8610857, nan, nan)
 (110.,  7.727924,  7.116364, 90.45003, 0.5366358, 0.8887361, nan, nan)
 (110.,  7.748454,  7.223625, 90.6782 , 0.5349852, 0.8855141, nan, nan)])

【问题讨论】:

  • np.unique(dataA[:,0], axis=0) 不会为您提供唯一的行,而是第一列中的唯一值。
  • 我知道我哪里错了,谢谢 yatu!!

标签: python numpy unique


【解决方案1】:

您可以检查数组中一行中的第一个值与下一行的值相等的位置,并根据结果进行索引:

dataA[dataA[:, 0] == np.roll(dataA, -1, axis=0)[:, 0]]

array([[107.       ,   7.475729 ,   6.573791 ,  90.0126   ,   0.5529882,
          0.867588 ],
       [108.       ,   7.838725 ,   6.961871 ,  89.52572  ,   0.5610707,
          0.7769735],
       [109.       ,   7.079929 ,   6.86194  ,  89.6181   ,   0.5660294,
          0.8596874]])

如果行不是根据第一个值排序的,请改用:

s = dataA[:,0].argsort()
dataA[s][dataA[s, 0] == np.roll(dataA, -1, axis=0)[s, 0]]

对于第二个例子,它产生:

array([[107.       ,   7.475729 ,   6.573791 ,  90.0126   ,   0.5529882,
          0.867588 ,         nan,         nan],
       [108.       ,   7.838725 ,   6.961871 ,  89.52572  ,   0.5610707,
          0.7769735,         nan,         nan],
       [109.       ,   7.079929 ,   6.86194  ,  89.6181   ,   0.5660294,
          0.8596874,         nan,         nan],
       [110.       ,   7.727924 ,   7.116364 ,  90.45003  ,   0.5366358,
          0.8887361,         nan,         nan]])

【讨论】:

  • 嗨 yatu,在我使用 nan 的第二组数据之前,它工作正常。
猜你喜欢
  • 2015-06-14
  • 1970-01-01
  • 2010-10-02
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多