你将如何有效地重新排列这个数组?
How would you reshuffle this array efficiently?
我有一个数组 arr_val
,它在大量位置存储某个函数的值(为了说明,我们只取一个小的 4 个位置)。现在,假设我还有另一个数组 loc_array
存储函数的位置,并假设位置再次为相同的数字 4。但是,位置数组是多维数组,因此每个位置索引都具有相同的 4子位置索引,每个子位置索引是一对坐标。为了清楚地说明:
arr_val = np.array([1, 2, 3, 4])
loc_array = np.array([[[1,1],[2,3],[3,1],[3,2]],[[1,2],[2,4],[3,4],[4,1]],
[[2,1],[1,4],[1,3],[3,3]],[[4,2],[4,3],[2,2],[4,4]]])
上面两个数组的意思就是一些感兴趣的参数的值,比如位置[1,1],[2,3],[3,1],[3,2]
是1
,等等。但是,我有兴趣以不同的形式重新表达上面的相同内容,而不是随机点,我希望坐标采用以下易于处理的形式
coord = [[[1,1],[1,2],[1,3],[1,4]],[[2,1],[2,2],[2,3],[2,4]],[[3,1],[3,2],
[3,3],[3,4]],[[4,1],[4,2],[4,3],[4,4]]]
各个坐标的值给出为
val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]
对于大型 numpy 数组,实现上述目标的一种非常有效的方法是什么?
它可能不是你想要的答案,但它仍然有效。
val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]
temp= ""
int_list = []
for element in val:
temp_int = temp.join(map(str, element ))
int_list.append(int(temp_int))
int_list.sort()
print(int_list)
## result ##
[1132, 1233, 2444, 3412]
- 把每个
element
array
改成int
构造int_list
- 排序
int_list
- 从
int_list
构建2D np.array
我跳过了最后一部分。你可以在网上找到方法。
您可以像这样使用 lexsort
:
>>> order = np.lexsort(loc_array.reshape(-1, 2).T[::-1])
>>> arr_val.repeat(4)[order].reshape(4, 4)
array([[1, 2, 3, 3],
[3, 4, 1, 2],
[1, 1, 3, 2],
[2, 4, 4, 4]])
如果您确定 loc_array 是所有可能位置的排列,那么您可以避免排序:
>>> out = np.empty((4, 4), arr_val.dtype)
>>> out.ravel()[np.ravel_multi_index((loc_array-1).reshape(-1, 2).T, (4, 4))] = arr_val.repeat(4)
>>> out
array([[1, 2, 3, 3],
[3, 4, 1, 2],
[1, 1, 3, 2],
[2, 4, 4, 4]])
我有一个数组 arr_val
,它在大量位置存储某个函数的值(为了说明,我们只取一个小的 4 个位置)。现在,假设我还有另一个数组 loc_array
存储函数的位置,并假设位置再次为相同的数字 4。但是,位置数组是多维数组,因此每个位置索引都具有相同的 4子位置索引,每个子位置索引是一对坐标。为了清楚地说明:
arr_val = np.array([1, 2, 3, 4])
loc_array = np.array([[[1,1],[2,3],[3,1],[3,2]],[[1,2],[2,4],[3,4],[4,1]],
[[2,1],[1,4],[1,3],[3,3]],[[4,2],[4,3],[2,2],[4,4]]])
上面两个数组的意思就是一些感兴趣的参数的值,比如位置[1,1],[2,3],[3,1],[3,2]
是1
,等等。但是,我有兴趣以不同的形式重新表达上面的相同内容,而不是随机点,我希望坐标采用以下易于处理的形式
coord = [[[1,1],[1,2],[1,3],[1,4]],[[2,1],[2,2],[2,3],[2,4]],[[3,1],[3,2],
[3,3],[3,4]],[[4,1],[4,2],[4,3],[4,4]]]
各个坐标的值给出为
val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]
对于大型 numpy 数组,实现上述目标的一种非常有效的方法是什么?
它可能不是你想要的答案,但它仍然有效。
val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]
temp= ""
int_list = []
for element in val:
temp_int = temp.join(map(str, element ))
int_list.append(int(temp_int))
int_list.sort()
print(int_list)
## result ##
[1132, 1233, 2444, 3412]
- 把每个
element
array
改成int
构造int_list
- 排序
int_list
- 从
int_list
构建
2D np.array
我跳过了最后一部分。你可以在网上找到方法。
您可以像这样使用 lexsort
:
>>> order = np.lexsort(loc_array.reshape(-1, 2).T[::-1])
>>> arr_val.repeat(4)[order].reshape(4, 4)
array([[1, 2, 3, 3],
[3, 4, 1, 2],
[1, 1, 3, 2],
[2, 4, 4, 4]])
如果您确定 loc_array 是所有可能位置的排列,那么您可以避免排序:
>>> out = np.empty((4, 4), arr_val.dtype)
>>> out.ravel()[np.ravel_multi_index((loc_array-1).reshape(-1, 2).T, (4, 4))] = arr_val.repeat(4)
>>> out
array([[1, 2, 3, 3],
[3, 4, 1, 2],
[1, 1, 3, 2],
[2, 4, 4, 4]])