Python 如何为每列使用不同的默认值初始化NumPy数组?

Python 如何为每列使用不同的默认值初始化NumPy数组?,python,arrays,python-2.7,numpy,matrix,Python,Arrays,Python 2.7,Numpy,Matrix,我试图初始化一个大小为(x,y)的NumPy矩阵,其中y非常大 矩阵的第一列是ID(整数),其余的是三元组(int8),其中三元组的每个成员都应该有不同的默认值 i、 e.假设默认值为[2,5,9]我想初始化以下矩阵: 0 2 5 9 2 5 9 2 5 9 ... 0 2 5 9 2 5 9 2 5 9 ... 0 2 5 9 2 5 9 2 5 9 ... 0 2 5 9 2 5 9 2 5 9 ... ... 我能想到的初始化矩阵的最快方法是: defaults = [2, 5, 9]

我试图初始化一个大小为(x,y)的NumPy矩阵,其中y非常大

矩阵的第一列是ID(整数),其余的是三元组(int8),其中三元组的每个成员都应该有不同的默认值

i、 e.假设默认值为
[2,5,9]
我想初始化以下矩阵:

0 2 5 9 2 5 9 2 5 9 ...
0 2 5 9 2 5 9 2 5 9 ...
0 2 5 9 2 5 9 2 5 9 ...
0 2 5 9 2 5 9 2 5 9 ...
...
我能想到的初始化矩阵的最快方法是:

defaults = [2, 5, 9]
mat = numpy.zeros(shape=(x,y),
                  dtype=['i'] + ['int8'] * (y - 1))
# fill the triplets with default values
for i in range(1, y/3):
    j = i * 3
    mat[:, j]   = defaults[0]
    mat[:, j+1] = defaults[1]
    mat[:, j+2] = defaults[2]
初始化这样一个矩阵的最快方法是什么


谢谢

您可以使用
np.tile
重塑值数组,例如:

>>> b=np.array([2,5,9])
>>> b=b.reshape(3,1)
>>> np.tile(b,3)
array([[2, 2, 2],
       [5, 5, 5],
       [9, 9, 9]])
然后可以使用
np.dstack
旋转数组,然后使用
np.hstack
添加零列:

>>> np.hstack((np.zeros((3,1)),np.dstack(new)[0]))
array([[ 0.,  2.,  5.,  9.],
       [ 0.,  2.,  5.,  9.],
       [ 0.,  2.,  5.,  9.]])
或者您可以使用
平铺
再次重复非零部分:

>>> np.hstack((np.zeros((3,1)),np.tile(np.dstack(new)[0],4)))
array([[ 0.,  2.,  5.,  9.,  2.,  5.,  9.,  2.,  5.,  9.,  2.,  5.,  9.],
       [ 0.,  2.,  5.,  9.,  2.,  5.,  9.,  2.,  5.,  9.,  2.,  5.,  9.],
       [ 0.,  2.,  5.,  9.,  2.,  5.,  9.,  2.,  5.,  9.,  2.,  5.,  9.]])
编辑:

为了澄清,简单的一行是:

defaults = [2, 5, 9]
np.hstack((np.zeros((x,1)), np.tile(defaults, (x,y))))

我会这样做

np.tile([0] + [2, 5, 9] * 4, (3, 1))
在这里,我使用列表加法和列表乘法来创建第一行,然后使用
np.tile
在三行上复制它
np.tile
自动将列表转换为数组,然后垂直复制三次。如果你愿意,你可以把它包装成这样的函数

def make_array(triple, n_triple, n_row):
    return np.tile([0] + list(triple) * n_triple, (n_row, 1))
在这里,我强制将
triple
作为一个列表,但是如果在调用此函数时小心地只将列表传递给
triple
变量,则不需要这样做


祝您好运

只需使用
np.tile()
函数的简单解决方案:

# Create a footprint array
a = np.array([2, 5, 9])

# Use the footprint array to create the required final array
res = np.tile(a, (4, 3))

>>>res
array([[2, 5, 9, 2, 5, 9, 2, 5, 9],
       [2, 5, 9, 2, 5, 9, 2, 5, 9],
       [2, 5, 9, 2, 5, 9, 2, 5, 9],
       [2, 5, 9, 2, 5, 9, 2, 5, 9]])

有关
np.tile()
的详细用法,请参阅。

您应该看看我想您可能有点困惑-在我的示例中,您编写的n_y实际上是x。您还通过使用列表乘法在y轴(列)中进行了复制,我认为这比NumPy的方法要慢。在我看来,
x,y
的使用令人困惑,因为
x,y
通常用于水平和垂直坐标(例如在绘图中)。就速度而言,当然
np.tile
对于
n_triple
的大值来说速度更快,但大多数情况下这是无关紧要的,我认为我的代码更简单,更容易阅读。如果我正在编写一些快速而肮脏的脚本,我不必考虑
np.zero
np.tile
np.hstack
的维度是如何协同工作的。关于
x,y
符号,你是对的,可能
m,n
会更好。关于列表乘法——它确实更简单,但是对于大y,它将比NumPy实现慢得多。在任何情况下,使用生成器表达式可能会更好,比如-
(i代表范围内的j(n_三元组)代表[2,5,9]中的i])