如何用另一个numpy数组填充numpy数组

2024-09-29 19:36:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个空的numpy数组,另一个用值填充。我想用填充的numpy数组填充空的numpy数组,x次。 所以,当x=3时,(原来是空数组)看起来像[[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]]

为你的帮助干杯。


Tags: tonumpyinputobjectisnpnot数组
3条回答

你可以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]])

注意,你经常不需要这样做。。。你可以用努比的广播做很多巧妙的把戏…:

>>> 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文档来熟悉这些选项。

使用广播

vstack、tile和repeat都很棒,但广播速度可以快几个数量级。。。

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

当您想以各种方式重复数组时,tilerepeat是很方便的函数:

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)

相关问题 更多 >

    热门问题