<p>首先,请记住,在您的代码中,<code>array</code>实际上并不是numpy数组,它是一个普通的Python <code>list</code>字符串。可以通过拆分字符串并将元素转换为整数来处理此列表,就像Anmol uppal的答案一样,但是将csv文件的内容直接转换成nrows x 6 numpy数组要简单得多,例如使用<code>np.loadtxt</code>:</p>
<pre><code>import numpy as np
data = np.loadtxt('rand1.csv', delimiter=',', dtype=np.int)
print(repr(data[0]))
# array([ 2, 6, 76, 45, 78, 1])
</code></pre>
<p>现在当您调用<code>optimize.newton</code>,<code>args=</code>参数应该得到一个由6个参数值组成的<em>序列</em>。由于<code>array</code>中的每一行包含一个字符串,而不是6个数值,所以原始代码无法正常工作。既然<code>data</code>*是一个nrows x 6数组,那么每一行都将包含6个数值,因此您现在只需执行以下操作:</p>
^{pr2}$
<p>*请注意,我已将变量<code>array</code>重命名为<code>data</code>,以避免与<code>np.array</code>类混淆</p>
<hr/>
<h2>更新</h2>
<p>在你的原始代码中还有一个我一开始没有发现的错误。查看<a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html" rel="nofollow">^{<cd11>}</a>的文档:</p>
<blockquote>
<p>func : function</p>
<blockquote>
<p>The function whose zero is wanted. It must be a function of a single variable <strong>of the form f(x,a,b,c...), where a,b,c... are extra arguments</strong> that can be passed in the args parameter.</p>
</blockquote>
<p>x0:浮动</p>
<blockquote>
<p>An initial estimate of the zero that should be somewhere near the actual zero.</p>
</blockquote>
</blockquote>
<p>现在看看你的函数定义:</p>
<pre><code>def func(a,b,c,d,e,f):
return a*b*c-d*e-f
</code></pre>
<p><code>func()</code>(您称之为<code>a</code>)的<em>第一个</em>参数应该对应于<em>x</em>参数,那么只有<em>5</em>额外参数(<code>b ... f</code>根据您的定义)需要使用<code>args=</code>传递。当你打电话的时候</p>
<pre><code>optimize.newton(func, 5102, args=(422, 858, 129, 312, 79, 371))
</code></pre>
<p>5102被解释为<code>x0</code>参数,并作为第一个参数传递给<code>func()</code>。<code>args=</code>元组中的<em>6</em>值被视为额外的参数,因此您的函数实际上总共获得了<em>7个</em>参数:</p>
<pre><code>func(5102, 422, 858, 129, 312, 79, 371)
</code></pre>
<p>显然,<code>func()</code>被定义为接受6个参数,因此会得到一个错误。解决此问题的正确方法取决于如何解释函数的参数。<code>newton</code>的目标是找到一个<em>x</em>的值,使得<em>f(x,a,b,c,…)=0</em>。在</p>
<p>6个参数中,您希望最小化<code>func()</code>中的哪一个?在</p>
<hr/>
<h2>完整的解释</h2>
<p>一个稍微有趣的问题是,当您以数组(例如<code>args=data[0]</code>)而不是元组的形式传递额外的参数时,为什么没有得到错误消息。答案有点复杂,但如果你感兴趣,请继续阅读。在</p>
<p>如果您查看<a href="https://github.com/scipy/scipy/blob/master/scipy/optimize/zeros.py#L158" rel="nofollow">the source code for ^{<cd11>}</a>,您可以找到第一次调用函数的行:</p>
<pre><code>q0 = func(*((p0,) + args))
</code></pre>
<p>在本例中,<code>p0</code>和{<cd25>}将是<code>newton()</code>的<code>x0</code>参数,<code>args</code>是一组额外参数:</p>
<pre><code>q0 = func(*((5102,) + (422, 858, 129, 312, 79, 371)))
</code></pre>
<p><code>(p0,)</code>是一个元组,如果<code>args</code>也是一个元组,那么{<cd31>}运算符将把这两个元组连接在一起:</p>
<pre><code>q0 = func(*(5102, 422, 858, 129, 312, 79, 371))
</code></pre>
<p>最后,<code>*</code>解压元组以将参数传递给<code>func</code>。最后的通话应该是这样的:</p>
<pre><code>q0 = func(5102, 422, 858, 129, 312, 79, 371)
</code></pre>
<p>这将引发一个错误,因为一个6参数函数有7个参数。然而{28}是<cdan}:</p>
<pre><code>q0 = func(*(5102,) + array([422, 858, 129, 312, 79, 371]))
</code></pre>
<p><code>+</code>将<em>向<code>args</code>中的每个元素添加</em>值<code>p0</code>:</p>
<pre><code>q0 = func(*(5524, 5960, 5231, 5414, 5181, 5473))
</code></pre>
<p>因为现在只有<em>6个</em>参数要去<code>func()</code>调用将成功,但是<code>newton</code>将收敛到错误的答案!在</p>
<p>我认为这在scipy中不是特别好的设计-它让我很困惑,因为在大多数其他情况下,任何类似数组的输入都可以,包括列表、元组、数组等。公平地说,它确实在<code>newton</code>的文档中指出<code>args=</code>应该是一个元组,但为了安全起见,我还是会进行类型检查或显式地将其转换为元组。我可以试着在scipy里解决这个问题。在</p>