Python:根据列/行创建具有填充值的数组

时间:2015-05-30 01:27:24

标签: python arrays numpy

10x10 array

假设您正在尝试创建由值矩阵(numpy数组)表示的合成图像10x10。此图像有三个被阻止的部分。在左上方的块中,列0-4和行0-4,值将为1.右侧块,列5-9和行0-9,将为0.剩余区域,列0-4和行5-9,将是2.(见附图)

创建此类对象的最快方法是什么?我知道您可以创建一个零数组并迭代地更改每列中的值,但我也理解这不是一种有效的方法。我假设它只涉及使用np.array生成数组,但我不太确定语法。

4 个答案:

答案 0 :(得分:2)

我的第一个想法是创建0的“空”数组,然后填充12的块。 E.g。

In [145]: C = np.zeros((10,10), int)

In [146]: C[:4,:4]=1

In [147]: C[:4,5:9]=2

In [148]: C
Out[148]: 
array([[1, 1, 1, 1, 0, 2, 2, 2, 2, 0],
       [1, 1, 1, 1, 0, 2, 2, 2, 2, 0],
       [1, 1, 1, 1, 0, 2, 2, 2, 2, 0],
       [1, 1, 1, 1, 0, 2, 2, 2, 2, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

您也可以创建块(使用np.ones等),并将它们连接起来。 hstackvstack只是连接的替代API。但是,在编译代码中,concatenate最终会使用这个initialize和assign方法。熟悉这两种方法是个好主意。

答案 1 :(得分:1)

怎么样,

import numpy as np

a = np.ones((5,5))
b = a*2.
c = np.zeros((10,5))

np.hstack((np.vstack((a,b)),c))

答案 2 :(得分:0)

这是一个功课问题吗?与numpy.concatenatenumpy.ones玩游戏,看看你如何去。

答案 3 :(得分:0)

对于类似于您的简单模式,您可以使用基本广播:

>>> numpy.array([1]*5 + [2]*5)[:,None] * numpy.array([1]*5 + [0]*5)
array([[1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [2, 2, 2, 2, 2, 0, 0, 0, 0, 0],
       [2, 2, 2, 2, 2, 0, 0, 0, 0, 0],
       [2, 2, 2, 2, 2, 0, 0, 0, 0, 0],
       [2, 2, 2, 2, 2, 0, 0, 0, 0, 0],
       [2, 2, 2, 2, 2, 0, 0, 0, 0, 0]])

[:,None]只是添加了第二条轴,所以我们有一个(10,1)大小数组,而不是(10,)大小数组,然后可以将其与(10,)数组相乘。直接使用广播。

或更简洁地说:

>>> numpy.outer([1]*5 + [2]*5, [1]*5 + [0]*5)

给出相同的结果。