【问题标题】:Check if an array is a column of a large matrix—Python检查一个数组是否是一个大矩阵的列——Python
【发布时间】:2018-04-27 15:48:18
【问题描述】:

我的代码需要在每次迭代中检查随机生成的数组是否是大矩阵的列。代码如下:

large_matrix=np.zeros((arr_size,loop_size))
flag = 0
while flag < loop_size:
    arr = arr_generator(arr_size)
    dist = np.sum(large_matrix-arr,axis=0)
    if 0 in dist:
        continue
    else:
        large_matrix[:,flag] = arr
        flag += 1

arr 是二进制,因为大的_matrix 占用大量内存。这段代码很慢。 numpy中有没有更有效的方法来处理这个问题?

【问题讨论】:

  • 有很多方法可以做到这一点,一种方法是求和 large_matrix 并将其存储在循环之外,然后检查 sum(arr) 是否在该总和向量中。
  • 感谢您的评论,sum(large_matrix) 会随着循环的进行而变化,另外,arr 是随机生成的,这意味着数组中两种元素的排列很重要。所以我不能仅仅使用sum(arr)来区分不同的arr

标签: arrays python-3.x matrix


【解决方案1】:

对于这个问题,使用素数乘积的唯一性可能是解决问题的好方法。要使用素数,我们需要:

  1. 用于存储素数的数组

  2. 一个数组生成器,可以产生不同类型元素的索引信息(由于数组,在这种情况下,是二进制的,我们只需要知道数组中一种元素的索引。 )

  3. 为了解决质数乘积引起的溢出问题,我们需要计算乘积的对数:

代码改写如下:

PRIME_NUMBER=np.array([2,3,5,7,11,13,17,23,29,31....], dtype='float')
flag = 0
loop_size = 100000
arr_size = 8
config = np.zeros(loop_size)
large_matrix=np.zeros((arr_size,loop_size))

while flag < loop_size:
    arr, idx = arr_generator(arr_size)
    prod = np.round(np.log10(np.prod(PRIME_NUMBER[idx])), 3)
    if prod in config:
        continue
    else:
        large_matrix[:,flag] = arr
        flag += 1

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多