【问题标题】:How to preallocate array in python for loop?如何在python for循环中预分配数组?
【发布时间】:2018-11-12 10:48:38
【问题描述】:

我正在尝试将以下 Matlab 代码转换为 Python 代码。我已经转换了超过 50% 的文件,但仍停留在这一点上。在 MATLAB 中:-

for kk=1:length(message_vector)
    pn_sequence_h=round(2*(rand(Mw/2,Nw/2)-0.5));
    pn_sequence_v=round(2*(rand(Mw/2,Nw/2)-0.5));
    correlation_h(kk)=corr2(cH1,pn_sequence_h);
    correlation_v(kk)=corr2(cV1,pn_sequence_v);
    correlation(kk)=(correlation_h(kk)+correlation_v(kk))/2;
end

在 Python 中-

for kk in range(1,len(message)):
    pn_sequence_h = random.sample(range(1000,100000),k = int(math.ceil(Mc/2.0)) * int(math.ceil(Nc/2.0)))
    for i in range(len(pn_sequence_h)):
        pn_sequence_h[i] = round(2*(pn_sequence_h[i]*0.00001 - 0.5))*0.06
        correlation=[]
        correlation.append[kk]=corr2(cD,pn_sequence_h[i])

我想将correlation_h(kk)=corr2(cH1,pn_sequence_h);line 更改为我已经做过但不起作用的 Python。

所以我想在 python 中创建一个列表,它将保存每个数字的值。 (kk)。我对python很陌生,所以我很困惑。请帮忙。

【问题讨论】:

  • 在外循环之外,correlation = [0]*len(message) 或其他一些标记值。然后就在循环内correlation[kk] = ...
  • 请注意,在您的代码 sn-p 中,您每次通过循环都会清空 correlation = [] 变量,而不仅仅是附加到它。

标签: python-2.7 matlab for-loop image-processing correlation


【解决方案1】:

MATLAB 代码所做的是每次通过循环隐式扩展矩阵。或者更具体地说,它每次创建一个长一个元素的新矩阵,然后将旧矩阵中的所有数据复制到新矩阵,然后删除旧矩阵。

Python 不允许你这样做,因为它很慢而且很危险。您最初需要创建一个所需大小的数组(如果您使用 numpy 数组),或者您需要显式增加大小(如果您使用的是列表)。请注意,这在 MATLAB 中也是缓慢且危险的,因此如果您执行此类操作,新版本的 MATLAB 编辑器会对您大喊大叫。

如果您正在改编 MATLAB 代码,您可能想要使用 numpy.所以这里是等效的 Python 代码:

import numpy as np
from numpy.random import random
from scipy.signal import correlate2d

correlation_h = np.zeros(len(message_vector))
correlation_v = np.zeros(len(message_vector))
correlation = np.zeros(len(message_vector))
for kk in range(len(message_vector)):
    pn_sequence_h = np.round(2*(random([Mw//2, Nw//2])-0.5))
    pn_sequence_v = np.round(2*(random([Mw//2, Nw//2])-0.5))
    correlation_h[kk] = np.corrcoef(cH1, pn_sequence_h)
    correlation_v[kk] = np.corrcoef(cV1, pn_sequence_v)
    correlation[kk] = (correlation_h[kk]+correlation_v[kk])/2

但是,您可以通过矢量化加法并使用 numpy.random.uniform 获得 -1 和 1 之间的随机值来简化此操作

import numpy as np
from numpy.random import random

message_len = len(message_vector)
correlation_h = np.zeros(message_len)
correlation_v = np.zeros(message_len)
for kk in range(message_len):
    pn_seq_h, pn_seq_v = np.round(uniform(-1, 1, [2, Mw//2, Nw//2]))
    correlation_h[kk] = np.corrcoef(cH1, pn_seq_h)
    correlation_v[kk] = np.corrcoef(cV1, pn_seq_v)
correlation = (correlation_h+correlation_v)/2

但是,这几乎肯定不是您真正想要的。在 MATLAB 中试试这个:

histogram(round(2*(rand(1,1000)-.5)))

您会看到 -1 和 +1 值的可能性低于 0 值。您几乎肯定想要随机值的均匀分布,您可以通过以下方式获得:

import numpy as np
from numpy.random import randint

message_len = len(message_vector)
correlation_h = np.zeros(message_len)
correlation_v = np.zeros(message_len)
for kk in range(message_len):
    pn_seq_h, pn_seq_v = randint(-1, 2, [2, Mw//2, Nw//2])
    correlation_h[kk] = np.corrcoef(cH1, pn_seq_h)
    correlation_v[kk] = np.corrcoef(cV1, pn_seq_v)
correlation = (correlation_h+correlation_v)/2

如果它不会导致数组太大,您甚至可以一次创建所有随机数,让您简化很多事情:

import numpy as np
from numpy.random import randint


message_len = len(message_vector)
correlation_h = np.zeros(message_len)
correlation_v = np.zeros(message_len)
for kk in range(message_len):
pn_seqs = randint(-1, 2, [message_len, 2, Mw//2, Nw//2])
for kk, (pn_seq_h, pn_seq_v) in enumerate(pn_seqs):
    correlation_h[kk] = np.corrcoef(cH1, pn_seq_h)
    correlation_v[kk] = np.corrcoef(cV1, pn_seq_v)
correlation = (correlation_h+correlation_v)/2

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多