【发布时间】:2021-01-20 17:04:09
【问题描述】:
我正在尝试按行按字典顺序对一些数组进行排序。整数情况完美:
>>> arr = np.random.choice(10, size=(5, 3))
>>> arr
array([[1, 0, 2],
[8, 0, 8],
[1, 8, 4],
[1, 3, 9],
[6, 1, 8]])
>>> np.ndarray(arr.shape[0], dtype=[('', arr.dtype, arr.shape[1])], buffer=arr).sort()
>>> arr
array([[1, 0, 2],
[1, 3, 9],
[1, 8, 4],
[6, 1, 8],
[8, 0, 8]])
我也可以进行排序
np.ndarray(arr.shape[0], dtype=[('', arr.dtype)] * arr.shape[1], buffer=arr).sort()
在这两种情况下,结果是相同的。但是,对象数组并非如此:
>>> selection = np.array(list(string.ascii_lowercase), dtype=object)
>>> arr = np.random.choice(selection, size=(5, 3))
>>> arr
array([['t', 'p', 'g'],
['n', 's', 'd'],
['g', 'g', 'n'],
['g', 'h', 'o'],
['f', 'j', 'x']], dtype=object)
>>> np.ndarray(arr.shape[0], dtype=[('', arr.dtype, arr.shape[1])], buffer=arr).sort()
>>> arr
array([['t', 'p', 'g'],
['n', 's', 'd'],
['g', 'h', 'o'],
['g', 'g', 'n'],
['f', 'j', 'x']], dtype=object)
>>> np.ndarray(arr.shape[0], dtype=[('', arr.dtype)] * arr.shape[1], buffer=arr).sort()
>>> arr
array([['f', 'j', 'x'],
['g', 'g', 'n'],
['g', 'h', 'o'],
['n', 's', 'd'],
['t', 'p', 'g']], dtype=object)
显然只有dtype=[('', arr.dtype)] * arr.shape[1] 的情况才能正常工作。这是为什么? dtype=[('', arr.dtype, arr.shape[1])] 有什么不同?排序显然在做某事,但乍一看,排序似乎是荒谬的。是否使用指针作为排序键?
就其价值而言,np.searchsorted 似乎在进行与np.sort 相同的比较,正如预期的那样。
【问题讨论】:
-
我认为第一种情况将结构化数组的元素包装在对象数组周围(例如
[(['f', 'r', 'h'],)]),而第二种情况直接从元素创建结构化数组(例如[('f', 'r', 'h')])。我猜第一种情况按数组排序,第二种按元素排序。 -
@Ehsan。这基本上就是代码显示的内容。我有点好奇为什么。
sort特别提到结构字段按字典顺序排序,但在这种情况下如何应用还不清楚。如果我们按指针值对数组进行排序,那么为什么不以同样的方式对标量进行排序。如果我们通过对象比较对标量进行排序,那么为什么不以同样的方式对数组进行排序呢? -
@hpaulj 有什么想法吗?