如何用for循环创建一个Numpy矩阵?

时间:2019-08-18 19:10:18

标签: python arrays loops numpy matrix

我正在尝试使用一个称为noise的随机数数组构造一个具有numpy的矩阵,该数组具有4个值,应与称为“ factor”的数组中的8个不同数相乘,从而在最终矩阵中产生8行。

因此,矩阵对于“噪声”中的每个值应具有4列,对于每个因子应具有8行。 我不知道该怎么实现。

这是我得到的代码:

import numpy as np  
from numpy import random

n = 4
noise = np.random.normal(size=n)


matrix = np.zeros((8,n)) # Pre-allocate matrix
for i in range(1,8):
   matrix[:,i] = [[noise]*i]


print(matrix)

我收到错误消息:


ValueError: setting an array element with a sequence.

3 个答案:

答案 0 :(得分:2)

您要构造的是外部产品

n = 4
noise = np.random.normal(size=n)
noise
# array([ 2.39723122, -0.99797246, -0.14242618, -0.55921136])

m = 8
factor = np.random.randint(0,10,m)
factor
# array([0, 5, 7, 6, 7, 3, 8, 6])

np.outer(factor,noise)
# array([[ 0.        , -0.        , -0.        , -0.        ],
#        [11.98615612, -4.98986228, -0.71213089, -2.79605682],
#        [16.78061856, -6.98580719, -0.99698324, -3.91447955],
#        [14.38338734, -5.98783473, -0.85455707, -3.35526818],
#        [16.78061856, -6.98580719, -0.99698324, -3.91447955],
#        [ 7.19169367, -2.99391737, -0.42727853, -1.67763409],
#        [19.17784979, -7.98377964, -1.13940942, -4.47369091],
#        [14.38338734, -5.98783473, -0.85455707, -3.35526818]])

许多二进制ufunc存在“外部”操作。因为外乘法

np.multiply.outer(factor,noise)

非常常见,它具有自己的功能outer

(对于乘法或其他ufunc)外部操作(对于一维操作数)大致等于

np.multiply(*np.ix_(factor,noise))

如果存在一个简化形式(乘积的乘积,加法的和,最小的最小值等),我们也可以写

np.prod(np.ix_(factor,noise))

最后,对于产品(有些无关),我们也可以使用einsum

np.einsum('i,j',factor,noise)

尽管einsum对于这个问题可能是过大了。

答案 1 :(得分:1)

您可以执行此操作,而不是使用循环:

matrix = np.random.normal(size=(1, n)) * np.arange(8).reshape(-1, 1)

在这里,乘法的左手边的形状为(1, n),而右手边的形状为(8, 1)。因此,它们都将被广播为(8, n)的形状,然后执行逐元素乘法。

答案 2 :(得分:0)

i

让我们看看您要分配的内容-针对特定的In [14]: np.array([[noise]*1]) Out[14]: array([[[-1.93374989, -1.16536624, 0.42338714, -2.39942219]]]) In [15]: np.array([[noise]*2]) Out[15]: array([[[-1.93374989, -1.16536624, 0.42338714, -2.39942219], [-1.93374989, -1.16536624, 0.42338714, -2.39942219]]]) In [16]: np.array([[noise]*3]) Out[16]: array([[[-1.93374989, -1.16536624, 0.42338714, -2.39942219], [-1.93374989, -1.16536624, 0.42338714, -2.39942219], [-1.93374989, -1.16536624, 0.42338714, -2.39942219]]])

*3

您正在将In [17]: [[noise]*3] Out[17]: [[array([-1.93374989, -1.16536624, 0.42338714, -2.39942219]), array([-1.93374989, -1.16536624, 0.42338714, -2.39942219]), array([-1.93374989, -1.16536624, 0.42338714, -2.39942219])]] 应用于列表-这意味着“复制”:

In [21]: np.zeros((8,4))[:,1].shape                                                                          
Out[21]: (8,)

形状为(1,1,4),(1,2,4),(1,3,4)等。Python中的括号创建一个列表;不要随便使用它们。但是

noise

您正试图将它们放入尺寸(8,)的插槽中。

您是否想将i的值乘以matrix = np.zeros((8,n)) # Pre-allocate matrix for i in range(8): matrix[i,:] = noise*i

matrix[i,:]

应该工作,将noise插槽与源{{1}}正确匹配。