假设您正在尝试创建由值矩阵(numpy数组)表示的合成图像10x10。此图像有三个被阻止的部分。在左上方的块中,列0-4和行0-4,值将为1.右侧块,列5-9和行0-9,将为0.剩余区域,列0-4和行5-9,将是2.(见附图)
创建此类对象的最快方法是什么?我知道您可以创建一个零数组并迭代地更改每列中的值,但我也理解这不是一种有效的方法。我假设它只涉及使用np.array生成数组,但我不太确定语法。
答案 0 :(得分:2)
我的第一个想法是创建0
的“空”数组,然后填充1
和2
的块。 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
等),并将它们连接起来。 hstack
和vstack
只是连接的替代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.concatenate
和numpy.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)
给出相同的结果。