我使用的是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)看起来像是打印的元组列表,除非没有 元组之间的逗号。如果我用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低于工作,但是上面的失败与索引错误具有相同的语法?
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和元组列表,列表列表或CSV文件初始化numpy.ndarray是相同的。这可能与我所看到的其他答案相反,即np.array需要一个元组列表,Stack Overflow问题 Define dtypes in NumPy using a list? 。
发现2:使用np.zeroes初始化numpy.ndarray,我无法从列表列表初始化ndarray。
发现3:对于列拼接,使用nd.array初始化numpy.ndarray,我可以进行列拼接(即e [:,2],但是拼接的语法,使用np.zeroes初始化方法是不同的['f2']。正常的元组列表不能拼接。
答案 0 :(得分:5)
a)看起来像是print中的元组列表,除了元组之间没有逗号。如果我用repr(a)打印它,它甚至有逗号。即便如此,它应该不再被视为b)正确吗?
绝对。 a
和b
有不同的类型:type(a)
为numpy.ndarray
,type(b)
为list
以下是否失败,因为dtype与我传入的列表不匹配?
不 - 问题在于您尝试使用列表列表填充它,而不是像a
那样填充元组列表。见here。我不完全确定这种行为的深层原因是什么,但我怀疑它与元组是不可变对象有关,而列表(和数组)是可变的。
以下是否失败,因为我不允许指定列表的dtype?
是的,此外,您还无法使用列表列表填充d
(请参阅上一个答案)。
为什么e)下面也是列表工作列表,但d)失败了?
查看dtype
的{{1}} - 它是e
,即数组中的每个元素都是长度为1的字符串。如果没有指定|S1
对于数组构造函数,类型将被确定为保存序列中所有对象所需的最小类型。在这种情况下,由于您将包含一些字符串的序列传递给它,它会将整数向上转换为字符串。
与e)相同的例子,但是这次用f)打印的元组列表初始化与e)相同,所以用元组列表和列表列表初始化真的是相同的吗?
同样,由于你没有给构造函数dtype
,所以所有内容都会被上传到dtype
。
与e和f相同的例子,但这次从文件初始化打印输出的引用的微小差异。这样生成的数组与e)和f)之间应该没有区别#对吗?
不,现在您告诉构造函数创建一个包含|S1
的数组,而dtype=object
和e
将有f
。
为什么拼接e低于工作,但是上面的失败,索引错误的语法相同?
查看dtype=|S1
- 您会看到它是a.shape
,即(3,)
是长度为3的1d向量。虽然它确实有可以将其编入索引的字段,但它索引没有第二个维度。相比之下,a
为e.shape
,因此您可以按列对其进行索引。