fgo*_*dra 5 python arrays sorting numpy multidimensional-array
说我有一个排序的numpy数组:
arr = np.array([0.0, 0.0],
[0.5, 0.0],
[1.0, 0.0],
[0.0, 0.5],
[0.5, 0.5],
[1.0, 0.5],
[0.0, 1.0],
[0.5, 1.0],
[1.0, 1.0])
Run Code Online (Sandbox Code Playgroud)
并假设我对其进行了非平凡的操作,以便拥有一个新数组,该数组与旧数组相同,但顺序不同:
arr2 = np.array([0.5, 0.0],
[0.0, 0.0],
[0.0, 0.5],
[1.0, 0.0],
[0.5, 0.5],
[1.0, 0.5],
[0.0, 1.0],
[1.0, 1.0],
[0.5, 1.0])
Run Code Online (Sandbox Code Playgroud)
问题是:如何获取中每个元素arr2放置位置的索引arr。换句话说,我想要一个方法,它同时接受两个数组并返回arr2与元素长度相同但长度为的数组arr。例如,返回数组的第一个元素将是arr2in中第一个元素的索引arr。
where_things_are(arr2, arr)
return : array([1, 0, 3, 2, 4, 5, 6, 8, 7])
Run Code Online (Sandbox Code Playgroud)
numpy中已经存在这样的功能吗?
编辑:
我试过了:
np.array([np.where((arr == x).all(axis=1)) for x in arr2])
Run Code Online (Sandbox Code Playgroud)
这返回了我想要的东西,但我的问题仍然存在:是否有使用numpy方法执行此操作的更有效方法?
编辑2:
如果的长度arr2与原始数组的长度不同(例如我从中删除了一些元素),它也应该起作用。因此,它不是查找和反转排列,而是查找元素位于何处。
关键是反转排列。即使原始数组未排序,下面的代码也能工作。如果它被排序,那么find_map_sorted可以使用这显然更快。
更新:为了适应 OP 不断变化的需求,我添加了一个处理丢失元素的分支。
import numpy as np
def invperm(p):
q = np.empty_like(p)
q[p] = np.arange(len(p))
return q
def find_map(arr1, arr2):
o1 = np.argsort(arr1)
o2 = np.argsort(arr2)
return o2[invperm(o1)]
def find_map_2d(arr1, arr2):
o1 = np.lexsort(arr1.T)
o2 = np.lexsort(arr2.T)
return o2[invperm(o1)]
def find_map_sorted(arr1, arrs=None):
if arrs is None:
o1 = np.lexsort(arr1.T)
return invperm(o1)
# make unique-able
rdtype = np.rec.fromrecords(arrs[:1, ::-1]).dtype
recstack = np.r_[arrs[:,::-1], arr1[:,::-1]].view(rdtype).view(np.recarray)
uniq, inverse = np.unique(recstack, return_inverse=True)
return inverse[len(arrs):]
x1 = np.random.permutation(100000)
x2 = np.random.permutation(100000)
print(np.all(x2[find_map(x1, x2)] == x1))
rows = np.random.random((100000, 8))
r1 = rows[x1, :]
r2 = rows[x2, :]
print(np.all(r2[find_map_2d(r1, r2)] == r1))
rs = r1[np.lexsort(r1.T), :]
print(np.all(rs[find_map_sorted(r2), :] == r2))
# lose ten elements
print(np.all(rs[find_map_sorted(r2[:-10], rs), :] == r2[:-10]))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |