我有一个空的numpy数组,另一个填充了值。我想用填充的数字填充空的numpy数组,x次。
因此,当x = 3时,(最初为空的数组)看起来像[[populated_array],[populated_array], [populated_array]]
每次populated_array都是相同的值/数组。 我试过这个
a = np.empty(3)
a.fill(np.array([4,6,6,1]))
但是得到这个
ValueError: Input object to FillWithScalar is not a scalar
想要这个
[[4,6,6,1],[4,6,6,1],[4,6,6,1]]
欢呼任何帮助。
答案 0 :(得分:6)
tile
和repeat
是很方便的函数:
In [233]: np.tile(np.array([4,6,6,1]),(3,1))
Out[233]:
array([[4, 6, 6, 1],
[4, 6, 6, 1],
[4, 6, 6, 1]])
如果失败,请记下fill
的文档:
a.fill(value)
Fill the array with a scalar value.
np.array([4,6,6,1])
不是标量值。 a
已初始化为3个元素float
数组。
如果形状正确,可以为数组的元素赋值:
In [241]: a=np.empty(3)
In [242]: a[:]=np.array([1,2,3]) # 3 numbers into 3 slots
In [243]: a
Out[243]: array([ 1., 2., 3.])
In [244]: a=np.empty((3,4))
In [245]: a[:]=np.array([1,2,3,4]) # 4 numbers into 4 columns
In [246]: a
Out[246]:
array([[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.]])
此fill
适用于对象类型数组,但结果完全不同,应谨慎使用:
In [247]: a=np.empty(3, object)
In [248]: a
Out[248]: array([None, None, None], dtype=object)
In [249]: a.fill(np.array([1,2,3,4]))
In [250]: a
Out[250]: array([array([1, 2, 3, 4]), array([1, 2, 3, 4]), array([1, 2, 3, 4])], dtype=object)
这个(3,)数组与其他方法生成的(3,4)数组不同。对象数组的每个元素都是指向同一事物的指针。更改a
的一个元素中的值会更改所有元素中的值(因为它们是同一个对象)。
In [251]: a[0][3]=5
In [252]: a
Out[252]: array([array([1, 2, 3, 5]), array([1, 2, 3, 5]), array([1, 2, 3, 5])], dtype=object)
答案 1 :(得分:3)
import numpy as np
from time import time
t = time()
for _ in xrange(10000):
a = np.array([4,6,6,1])
b = np.vstack((a,)*100)
print time()-t
t = time()
for _ in xrange(10000):
a = np.array([4,6,6,1])
b = np.tile(a,(3,1))
print time()-t
t = time()
for _ in xrange(10000):
a = np.array([4,6,6,1])
b = np.empty([100,a.shape[0]])
b[:] = a
print time()-t
打印:
2.76399993896
0.140000104904
0.0490000247955
答案 2 :(得分:2)
你可以vstack
:
>>> a = np.array([4,6,6,1])
>>> np.vstack((a,)*3)
array([[4, 6, 6, 1],
[4, 6, 6, 1],
[4, 6, 6, 1]])
请注意,经常不需要这样做......你可以通过numpy的广播做很多巧妙的技巧......:
>>> a = np.array([4,6,6,1])
>>> ones = np.ones((4, 4))
>>> ones * a
array([[ 4., 6., 6., 1.],
[ 4., 6., 6., 1.],
[ 4., 6., 6., 1.],
[ 4., 6., 6., 1.]])
在某些情况下,您还可以使用np.newaxis
和...
来做整洁的事情。可能值得查看numpy's indexing文档以熟悉这些选项。
答案 3 :(得分:1)
正如Numpy Array文档所述,第一个参数是shape
,当你做的时候是儿子:
a = np.empty(3)
您正在创建一个维度为3的数组(只有一个维度)。 相反,你应该这样做:
a = np.empty([3,3])
创建一个包含3个维度子阵列的数组,每个子维度的维数为3(即矩阵3x3)。
正如Numpy fill文档所述,fill
只接受一个数字(标量)作为参数,因此您不能使用另一个数组作为参数,并且您所做的事情不能正常工作:
a.fill(np.array([4,6,6,1]))
要实现你想要做的事情,我会这样做:
a = np.array([[4,6,6,1]]*3)
希望我的评论可以帮到你!
答案 4 :(得分:0)
这样的重复任务通常简化为矩阵或向量运算。 np.outer()的执行速度甚至比与眼图矩阵相乘或填充空数组还要快:
>>>a = np.array([4,6,6,1])
>>>b = np.outer(np.ones(3, dtype=np.int), a)
>>>b
array([[4, 6, 6, 1],
[4, 6, 6, 1],
[4, 6, 6, 1]])
答案 5 :(得分:0)
您可以使用np.full()
,如here所述。
>>>repetitions = 3
>>>fill_array = np.array([4,6,6,1])
>>>fill_shape = np.shape(fill_array)
>>>a = np.full([*(repetitions,),*fill_shape],fill_array)
>>>a
array([[4, 6, 6, 1],
[4, 6, 6, 1],
[4, 6, 6, 1]])