比较numpy数组中的数字

ebdffaop  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(90)

假设我有一个数组,它总共存储了800,000个类型为'int8'的整数。我想比较数组中的每一对数字,如果这两个位置上的数字相等,结果应该是1,如果这两个位置上的数字不相等,结果应该是0。结果应存储在大小为(800000,800000)的类型为'int8'的数组中。在优化速度和最小化内存使用的同时,有哪些有效的方法来计算这个值?
前任

array = [52, 41, 62 , 52]
result
[1,0,0,1
 0,1,0,0
 0,0,1,0
 1,0,0,1]

字符串

gg0vcinb

gg0vcinb1#

建了一张Map:瓦尔-> indices,其中每个值指向保存该值的索引数组。解析你的数组并在线性时间内填充你的Map。
现在,你已经拥有了轻松打印数组所需的一切,但你的存储只是线性的(通过打印或存储为n^2矩阵是O(n^2),这不能变得更有效)。
例如:

array = [52, 41, 62 , 52]
map = {52 => [0, 3],
       41 => [1],
       62 => [2]}

字符串
要打印,请遍历Map的索引数组。给定的索引数组将生成与数组中的值一样多的行,数组中的每个值为1,其他值为0。输出进入与数组中的索引相对应的行。
例如:

52 => [0, 3] gives us the row [1, 0, 0, 1], which will be the 0th and 3rd row.
41 => [1] gives us the row [0, 1, 0, 0], which will be the 1st row
62 => [2] gives us the row [0, 0, 1, 0], which will be the 2nd row.

ldioqlga

ldioqlga2#

同意评论,根据您试图完成的内容,您可能需要重新考虑问题,但这里是您提出的特定问题的解决方案,并借鉴this answer

import numpy as np

tst_arr = np.array([1,2,3,1]).astype('int8')

## create array of all permutations
perm_arr = np.empty((tst_arr.size, tst_arr.size, 2), dtype=tst_arr.dtype)
perm_arr[..., 0] = tst_arr[:, None]
perm_arr[..., 1] = tst_arr

## create binary array that checks if values are equal
check_arr = np.zeros((tst_arr.size, tst_arr.size)).astype('int8')
check_arr = np.where(perm_arr[:,:,0]==perm_arr[:,:,1], 1, 0)

print(check_arr)
[[1 0 0 1]
 [0 1 0 0]
 [0 0 1 0]
 [1 0 0 1]]

字符串

相关问题