我正在尝试使用一个称为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.
答案 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}}正确匹配。