【发布时间】:2015-07-12 10:26:48
【问题描述】:
我正在尝试初始化一个大小为 (x,y) 的 NumPy 结构化 矩阵,其中 x 的值为 ~ 10^3,y 的值为 ~ 10^6。
矩阵的第一列是一个ID(整数),其余是三元组(int8),其中三元组的每个成员应该有不同的默认值。
即假设默认值为[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 ...
...
这里的问题(VS.this similar question)是每一列都有不同的唯一名称,应该记录。
我能想到的初始化矩阵的最快方法是:
default_age = 2
default_height = 5
default_shoe_size = 9
columns = ["id",
"a_age",
"a_height",
"a_shoe_size",
"b_age",
"b_height",
"b_shoe_size",
#...
]
y = len(columns)
x = 10**4
# generate matrix
mat = numpy.zeros(shape=x,
dtype={"names" : columns,
"formats" : ['i'] + ['int8'] * (len(columns) - 1)})
# fill the triplets with default values
for i in xrange(y/3):
j = i * 3
mat[mat.dtype.names[j+1]] = default_age
mat[mat.dtype.names[j+2]] = default_height
mat[mat.dtype.names[j+3]] = default_shoe_size
初始化这样一个矩阵的最快方法是什么?
谢谢!
【问题讨论】:
-
您是否有理由不只使用
pandas数据帧? -
这里有些可疑。您正在创建一个二维数组(形状为
(x, len(columns))),该数组的每个元素本身就是一个带有len(columns)字段的结构。你确定那是你想要的吗? (我的猜测是你真的想要一个 一维 结构化数组。) -
虽然我还没有消化你的结构描述,但我的经验是,将数据逐个字段复制到结构化数组中通常是最快的方法。或者列出所有必要的元组。
-
@Warren Weckesser 你说得对 - 我的意思是创建一个 1D 结构化数组,编辑问题以反映这一点。谢谢!
-
在担心“最快”之前,您应该给我们一个工作示例。您没有指定
x或y,您的mat[:,i+1]索引将不适用于结构化数组。
标签: python arrays python-2.7 numpy matrix