繁体   English   中英

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

[英]How to fill numpy array with another numpy array

我有一个空的 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]]

欢呼任何帮助。

当您想以各种方式重复数组时, 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)

使用广播

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

你可以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 的索引文档以熟悉这些选项。

正如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)

希望我的评论对你有帮助!

像这样的重复任务通常会简化为矩阵或向量运算。 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]])

你可以使用np.full()如所描述这里

>>>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]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM