擅长:python、mysql、java
<p><strong>下面是在Python2.7中用numpy再现此错误的另一种方法:</strong></p>
<pre><code>import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate(a,b) #note the lack of tuple format for a and b
print(c)
</code></pre>
<p><code>np.concatenate</code>方法产生错误:</p>
<pre><code>TypeError: only length-1 arrays can be converted to Python scalars
</code></pre>
<p>如果您阅读了关于<a href="http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.concatenate.html" rel="noreferrer">numpy.concatenate</a>的文档,就会发现它需要一个numpy数组对象元组。因此,用parens将变量包围起来,就解决了这个问题:</p>
<pre><code>import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate((a,b)) #surround a and b with parens, packaging them as a tuple
print(c)
</code></pre>
<p>然后它会打印:</p>
<pre><code>[1 2 3 4 5 6]
</code></pre>
<p>这里怎么了?</strong></p>
<p>这个错误是冒泡实现的一个例子——它是由python的duck类型哲学引起的。这是一个神秘的低级错误python guts puke up,当它接收到一些意外的变量类型,试图跑掉并做一些事情,得到一部分通过,pukes,尝试补救行动,失败,然后告诉你“当周二的风从东方吹来时,你无法重新构造子空间响应器”。</p>
在更为敏感的语言如C++或java中,它会告诉你:“你不能使用TypeB所期望的类型。”但Python做的最好是坚持下去,做一些未定义的事情,失败了,然后把一个无用的错误交给你。我们必须讨论这一点,这是我不喜欢Python或它的duck类型哲学的原因之一。</p>