如何在 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
我正在尝试将以下 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