如何在python for pre循环中预分配数组?

时间:2018-06-02 14:27:33

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

我正在尝试将以下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);行改为Python,我已经做了但没有工作。

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

1 个答案:

答案 0 :(得分:2)

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