请说明以下Python NumPy数组初始化和拼接示例

fra*_*ank 5 python numpy multidimensional-array

我正在使用Python 2.6版,我正在学习NumPy 1.3版.

我已经尝试了下面的几个NumPy数组初始化和列拼接示例,并在最后添加了一些内联问题作为注释和结果列表.希望有人可以向我解释行为差异背后的原因.很多相互关联的问题和相当长的帖子,但每个例子都很小,随便回答一个或几个.

import numpy as np

print "Initializing a number of numpy arrays:\n"
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

问题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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

问题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]
Run Code Online (Sandbox Code Playgroud)

查找1:使用nd.array和元组列表,列表列表或CSV文件初始化numpy.ndarray是相同的.这可能与我所看到的其他答案相反,即np.array期望一个元组列表,Stack Overflow问题使用列表在NumPy中定义dtypes?.

发现2:使用np.zeroes初始化numpy.ndarray,我无法从列表列表初始化ndarray.

查找3:对于列拼接,使用nd.array初始化numpy.ndarray,我可以进行列拼接(即e [:,2],但是拼接的语法,使用np.zeroes初始化方法是不同的['f2'].无法拼接正常的元组列表.

ali*_*i_m 5

问题1

a)看起来像print中的元组列表,除了元组之间没有逗号.如果我用repr(a)打印它,它甚至有逗号.即便如此,它应该不再被视为b)正确吗?

绝对.a并且b有不同的类型:type(a)numpy.ndarray,type(b)list

问题2

以下是否失败,因为dtype与我传入的列表不匹配?

不 - 问题在于您尝试使用列表列表填充它,而不是像您一样填充元组列表a.看到这里.我不完全确定这种行为的深层原因是什么,但我怀疑它与元组是不可变对象有关,而列表(和数组)是可变的.

问题3

以下是否失败,因为我不允许指定一个列表的dtype?

是的,此外,您也无法填写d列表清单(请参阅上一个答案).

问题4

为什么e)下面也列出了列表工作,但d)失败了?

dtypee-是|S1的,即数组中的每一个元素是一个长度为1的字符串.如果你指定一个不dtype为数组构造,类型将被确定为保持所需的最小类型的所有对象的序列.在这种情况下,由于您将包含一些字符串的序列传递给它,因此它会将整数转换为字符串.

问题5

与e)相同的例子,但是这次用f)打印​​的元组列表初始化与e)相同,所以用元组列表和列表列表初始化真的是相同的吗?

同样,既然你没有给构造函数一个dtype,那么一切都会被上传到|S1.

问题6

与e和f相同的例子,但是这次从文件初始化打印输出的引用的次要差异.像这样生成的数组和e)和f)之间应该没有区别#对吗?

不,现在你告诉构造函数来创建一个数组dtype=object,而ef会有dtype=|S1.

问题7

为什么拼接e低于工作,但是上面的失败与索引错误具有相同的语法?

看看a.shape- 你会看到它(3,),即a是一个长度为3的1d向量.虽然它确实有你可以索引它的字段,但它没有你索引的第二个维度.相比之下,e.shape(3,3),所以你可以按列索引它.