我有一个空的numpy数组,另一个填充了值。我想用填充的x次填充空的numpy数组。因此,当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]]为任何帮助干杯。
发布于 2016-12-08 18:06:33
当您想以各种方式重复数组时,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)发布于 2016-12-08 18:08:45
使用广播
V堆栈,瓷砖和重复都很棒,但是广播速度可以快几个数量级.
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发布于 2016-12-08 18:01:43
您可以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索引文档。
https://stackoverflow.com/questions/41045871
复制相似问题