【问题标题】:Please clarify the following Python NumPy array initialization and splicing examples请澄清以下Python NumPy数组初始化和拼接示例
【发布时间】:2013-07-11 08:39:43
【问题描述】:

我正在使用 Python 2.6 版并且正在学习 NumPy 1.3 版。

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

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) 下面的 list 也可以工作,但 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 初始化 numpy.ndarray 与元组列表、列表列表或 CSV 文件相同。这可能与我查看的其他答案相反,即 np.array 需要一个元组列表,堆栈溢出问题 Define dtypes in NumPy using a list?

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

发现3:对于列拼接,使用nd.array初始化numpy.ndarray,我可以做一个列拼接(也就是e[:,2],但是拼接的语法,使用np.zeroes初始化方法不同a['f2']。不能拼接正常的元组列表。

【问题讨论】:

  • 你应该试着把这篇文章分解成单独的问题,这些问题应该单独发布,并且可以有明确的答案。
  • @DaveP 感谢您的建议。一堆这些问题是相互关联的,也许最好一次性解决。我认为对于以后尝试学习这一点的其他人来说,在一个地方有一堆可能会混淆 numpy 数组的示例会很有帮助。如果几天后我没有得到任何答复。我可以进一步分解它们。

标签: python numpy multidimensional-array


【解决方案1】:

问题 1

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

当然。 ab 有不同的类型:type(a)numpy.ndarraytype(b)list

问题 2

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

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

问题 3

下面的失败是因为我不允许指定一个列表的 dtype 吗?

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

问题 4

为什么 e) 下面的列表也可以工作,但 d) 会失败?

查看edtype - 它是|S1,即数组中的每个元素都是长度为1 的字符串。如果您没有为数组构造函数指定dtype,则类型将被确定为保存序列中所有对象所需的最小类型。在这种情况下,由于你给它一个包含一些字符串的序列,它会将整数向上转换为字符串。

问题 5

和e)的例子一样,但是这次用f)打印出来的元组列表初始化和e)是一样的,那么用元组列表和列表初始化真的是一样的吗?

同样,由于您没有给构造函数一个dtype,所以所有内容都会向上转换为|S1

问题 6

与 e 和 f 的示例相同,但这次从文件中初始化 打印输出的引用略有不同。 # 这样生成的数组和e)、f)应该没有区别吧?

不,现在您告诉构造函数使用dtype=object 创建一个数组,而ef 将拥有dtype=|S1

问题 7

为什么在下面拼接 e 可以工作,但在上面使用相同语法的 Index 错误会失败?

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

【讨论】:

  • 非常感谢。我知道这是一篇问题论文,但我很高兴你花时间回答所有问题。现在它们都说得通了。
猜你喜欢
  • 2015-11-24
  • 2023-04-07
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 2018-12-31
  • 2011-03-19
  • 2018-12-04
  • 2011-05-30
相关资源
最近更新 更多