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

How to preallocate array in python for loop?

我正在尝试将以下 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 很陌生,所以我很困惑。请帮忙。

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