假设我有一个数组,它总共存储了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]
字符串
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.
型
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]]
2条答案
按热度按时间gg0vcinb1#
建了一张Map:瓦尔-> indices,其中每个值指向保存该值的索引数组。解析你的数组并在线性时间内填充你的Map。
现在,你已经拥有了轻松打印数组所需的一切,但你的存储只是线性的(通过打印或存储为n^2矩阵是O(n^2),这不能变得更有效)。
例如:
字符串
要打印,请遍历Map的索引数组。给定的索引数组将生成与数组中的值一样多的行,数组中的每个值为1,其他值为0。输出进入与数组中的索引相对应的行。
例如:
型
ldioqlga2#
同意评论,根据您试图完成的内容,您可能需要重新考虑问题,但这里是您提出的特定问题的解决方案,并借鉴this answer:
字符串