我正在使用 Python 2.6 版并且正在学习NumPy 1.3 版。
我在下面尝试了几个 NumPy 数组初始化和列拼接示例,并在最后添加了一些内联问题作为评论和结果列表。希望有人可以向我解释行为差异背后的原因。很多相互关联的问题和一个相当长的帖子,但每个例子都很小,随意回答一个或几个。
import numpy as np
print "Initializing a number of numpy arrays:\n"
a) 从元组列表初始化
a = np.zeros((3,),dtype=('i4,i4,a1'))
a[:] = [(1, 2, 'A'), (3, 4, 'B'),(5, 6, 'A')]
print "a: "
print a # print => [(1, 2, 'A') (3, 4, 'B') (5, 6, 'A')]
print repr(a) # print => array([(1, 2, 'A'), (3, 4, 'B'), (5, 6, 'A')],
# dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '|S1')]
print '\n'
b) 一个正常的元组列表
b = [];
b[:] = [(1, 2, 'A'), (3, 4, 'B'),(5, 6, 'A')]
print "b: "
print b # print => [(1, 2, 'A'), (3, 4, 'B'), (5, 6, 'A')
print '\n'
问题 1 : a) 看起来像是来自 print 的元组列表,除了元组之间没有逗号。如果我用 repr(a) 打印它,它甚至还有逗号。即便如此,它不应再被视为与 b) 相同,对吗?
c) 失败:尝试将从 np.zeroes 返回的数组初始化为列表列表
问题 2:以下是否因为 dtype 与我传入的列表不匹配而失败?
c = np.zeros((3,),dtype=('i4,i4,a1'))
#c[:] = [[1, 2, 'A'], [3, 4, 'B'],[5, 6, 'A']]
# TypeError: expected a readable buffer object
print '\n'
d) 失败:与 c) 相同,但尝试将 dtype 设置为列表
问题 3:以下是否失败,因为我不允许指定一个列表的 dtype?
#d = np.zeros((3,),dtype=['i4,i4,a1'])
# TypeError: data type not understood
#d[:] = [[1, 2, 'A'], [3, 4, 'B'],[5, 6, 'A']]
print '\n'
e) 尝试使用列表列表中的 np.array 初始化数组
问题 4:为什么下面的 e) 也是列表工作的列表,但 d) 失败?
e = np.array( [[1, 2, 'A'], [3, 4, 'B'],[5, 6, 'A']] )
print "e: "
print e # print => [['1' '2' 'A']
# ['3' '4' 'B']
# ['5' '6' 'A']]
print '\n'
f) 尝试使用元组列表中的 np.array 初始化数组
问题 5:与 e) 相同的示例,但这次使用他从 f) 打印出来的元组列表进行初始化与 e) 相同,那么使用元组列表和列表列表进行初始化真的是相同的吗?
f = np.array( [(1, 2, 'A'), (3, 4, 'B'),(5, 6, 'A')] )
print "f: "
print f # print => [['1' '2' 'A']
# ['3' '4' 'B']
# ['5' '6' 'A']]
print '\n'
g) 尝试使用CSV文件中的 np.array 初始化数组
问题 6:与 e 和 f 的示例相同,但这次从文件中初始化 打印输出的引用略有不同。# 这样生成的数组与 e) 和 f) 之间应该没有区别,对吧?
from StringIO import StringIO
data = StringIO( """
1, 2, A
3, 4, B
5, 6, A
""".strip())
g = np.genfromtxt(data, dtype=object, delimiter=',')
print "g: "
print g # print => [[1 2 A]
# [3 4 B]
# [5 6 A]]
print '\n'
h) 按列拼接 NumPy 数组
#print "a: "
#print a[:,2] # IndexError: invalid index
print "a: "
print a['f2'] # This is ok though
# Splicing a normal list of tuples if not expected to work
#print "b: "
#print b[:,2] # IndexError: invalid index
问题 7为什么在下面拼接 e 可以工作,但在上面拼接失败并出现 Index 错误,语法相同?
print "e: "
print e[:,2] # print => ['A' 'B' 'A']
print "f: "
print f[:,2] # print => ['A' 'B' 'A']
print "g: "
print g[:,2] # print => [A B A]
发现 1:使用 nd.array 初始化 numpy.ndarray 与元组列表、列表列表或 CSV 文件相同。这可能与我查看的其他答案相反,即 np.array 需要一个元组列表,堆栈溢出问题使用列表在 NumPy 中定义 dtypes?.
发现 2:使用 np.zeroes 初始化 numpy.ndarray,我无法从列表中初始化 ndarray。
发现3:对于列拼接,使用nd.array初始化numpy.ndarray,我可以做一个列拼接(也就是e[:,2],但是拼接的语法,使用np.zeroes的初始化方式是不一样的) ['f2']. 不能拼接正常的元组列表。