<p>这个答案给出了一个使用<a href="http://docs.scipy.org/doc/numpy/user/basics.rec.html" rel="nofollow">structured arrays</a>的解决方案。它有以下要求:即使一个函数<code>f</code>返回<code>N</code>数组,并且每个返回数组的大小可以不同<em>,那么对于<code>f</code>的所有结果,<code>len(array_i)</code>必须始终相同</em>。例如</p>
<pre><code>arrs_a = f("a")
arrs_b = f("b")
for sub_arr_a, sub_arr_b in zip(arrs_a, arrs_b):
assert len(sub_arr_a) == len(sub_arr_b)
</code></pre>
<p>如果上述情况属实,则可以使用结构化数组。结构化数组类似于普通数组,只是具有复杂的数据类型。例如,我可以指定一个数据类型,它由一个shape<code>5</code>的int数组和另一个shape<code>(2, 2)</code>的float数组组成。例如</p>
<pre><code># define what a record looks like
dtype = [
# tuples of (field_name, data_type)
("a", "5i4"), # array of five 4-byte ints
("b", "(2,2)f8"), # 2x2 array of 8-byte floats
]
</code></pre>
<p>使用<code>dtype</code>可以创建一个结构化数组,并一次性设置结构化数组上的所有结果。你知道吗</p>
<pre><code>import numpy as np
def func(n):
"mock implementation of func"
return (
np.ones(5) * n,
np.ones((2,2))* n
)
# define what a record looks like
dtype = [
# tuples of (field_name, data_type)
("a", "5i4"), # array of five 4-byte ints
("b", "(2,2)f8"), # 2x2 array of 8-byte floats
]
size = 5
# create array
arr = np.empty(size, dtype=dtype)
# fill in values
for i in range(size):
# func must return a tuple
# or you must convert the returned value to a tuple
arr[i] = func(i)
# alternate way of instantiating arr
arr = np.fromiter((func(i) for i in range(size)), dtype=dtype, count=size)
# How to use structured arrays
# access individual record
print(arr[1]) # prints ([1, 1, 1, 1, 1], [[1, 1], [1, 1]])
# access specific value get second record -> get b field -> get value at 0,0
assert arr[2]['b'][0,0] == 2
# access all values of a specific field
print(arr['a']) # prints all the a arrays
</code></pre>