nditer迭代和Python3打印格式的问题
我正在使用nditer迭代和Python3打印格式的问题,python,python-3.x,numpy,Python,Python 3.x,Numpy,我正在使用 for a, b in np.nditer([a_array, b_array]): print("{0:.3g},{1:.3g}".format(a, b)) 但我收到了TypeError:传递给对象的非空格式字符串。uuu format\uuuu 如果我插入整数而不是a和b: for a, b in np.nditer([a_array, b_array]): print("{0:.3g},{1:.3g}".format(2, 3)) 它起作用了 所以我想我对
for a, b in np.nditer([a_array, b_array]):
print("{0:.3g},{1:.3g}".format(a, b))
但我收到了TypeError:传递给对象的非空格式字符串。uuu format\uuuu
如果我插入整数而不是a
和b
:
for a, b in np.nditer([a_array, b_array]):
print("{0:.3g},{1:.3g}".format(2, 3))
它起作用了
所以我想我对a_数组
和b_数组
中的值有问题。它们不被解释为正常数字吗
如果在nditer()中选择只读标志,是否可以优化性能
编辑
一个例子
import numpy as np
a_array = np.array([])
b_array = np.array([])
number = float(input("Input number: "))
a_array = np.append(a_array, number)
b_array = np.append(b_array, number)
for a, b in np.nditer([a_array, b_array]):
print("(a,W) = ({0:.3g},{1:.3g})".format(a, b))
nditer
不提供标量,它提供1个元素数组:
In [6]: for a in np.nditer(np.arange(1)):
print(type(a))
...:
<class 'numpy.ndarray'>
In [7]: a
Out[7]: array(0)
“老式”迭代器可以工作(对2个数组使用zip
)
通用格式规范也起作用:print({!s},{!r})。格式(a,a))
基本上,g
和其他数字格式规范不能与迭代变量nditer
一起使用,因为它们是数组,而不是标量。我猜这是np.\uuu格式\uuu
方法的问题。它只能使用继承的对象
版本
ps-提供一些样本数组可能会避开反对票,即使细节不重要
默认情况下,nditer
生成readonly
值。因此,设置标志不会更改它们(为标量)或提高效率:
In [258]: for a in np.nditer(A):a[...]=1
...
ValueError: assignment destination is read-only
指定读/写标志在以下情况下非常有用:
In [268]: A=np.array([0,1,2,3])
In [269]: B=np.empty((4,))
In [270]: for a,b in np.nditer([A,B],op_flags=[['readonly'],['readwrite']]):
b[...] = a*2
.....:
In [271]: B
Out[271]: array([ 0., 2., 4., 6.])
对于您的示例,“For zip”可以工作,而且速度更快。保留nditer
,以备需要其额外功能时使用
In [274]: for a,b in zip(a_array, b_array):
.....: print("(a,W) = ({0:.3g},{1:.3g})".format(a, b))
(a,W) = (20,20)
如果您在a_数组
和b_数组
中显示值,这会很有帮助,特别是假设问题源于此。这些数组的确切值并不重要。即使是最简单的np.arange(10)
也有这个问题。注意根据您的新示例添加。
In [258]: for a in np.nditer(A):a[...]=1
...
ValueError: assignment destination is read-only
In [268]: A=np.array([0,1,2,3])
In [269]: B=np.empty((4,))
In [270]: for a,b in np.nditer([A,B],op_flags=[['readonly'],['readwrite']]):
b[...] = a*2
.....:
In [271]: B
Out[271]: array([ 0., 2., 4., 6.])
In [274]: for a,b in zip(a_array, b_array):
.....: print("(a,W) = ({0:.3g},{1:.3g})".format(a, b))
(a,W) = (20,20)