假设我有一个numpy数组x
和另一个y = x ** 2
。
我正在寻找一个更容易的替代
for i in range(x.size):
print(x[i], y[i])
使用一个数组,可以执行print(*x, sep = '\n')
,这比for循环更容易。我正在考虑将x
和y
转换为字符串数组,然后将它们添加到数组z
然后使用print(*z, sep = '\n')
。但是,我尝试这样做,但是在执行添加操作时numpy会出错。
编辑:这是我用于此
的功能def to_str(*args):
return '\n'.join([' '.join([str(ls[i]) for ls in args]) for i in range(len(args[0]))]) + '\n'
>>> x = np.arange(10)
>>> y = x ** 2
>>> print(to_str(x,y))
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
>>>
答案 0 :(得分:0)
你可以沿着这些方向做点什么 -
# Input arrays
In [238]: x
Out[238]: array([14, 85, 79, 89, 41])
In [239]: y
Out[239]: array([13, 79, 13, 79, 11])
# Join arrays with " "
In [240]: z = [" ".join(item) for item in np.column_stack((x,y)).astype(str)]
# Finally print it
In [241]: print(*z, sep='\n')
14 13
85 79
79 13
89 79
41 11
# Original approach for printing
In [242]: for i in range(x.size):
...: print(x[i], y[i])
...:
14 13
85 79
79 13
89 79
41 11
为了使事情更紧凑,np.column_stack((x,y))
可以替换为np.vstack((x,y)).T
。
创建z
的其他方法很少,如下所示 -
z = [str(i)[1:-1] for i in zip(x,y)] # Prints commas between elems
z = [str(i)[1:-1] for i in np.column_stack((x,y))]
z = [str(i)[1:-1] for i in np.vstack((x,y)).T]
答案 1 :(得分:0)
或者如果快速和脏的东西就足够了:
print(np.array((x,y)).T)
答案 2 :(得分:0)
这是没有循环的一种方式:
print(np.array2string(np.column_stack((x, y)),separator=',').replace(' [ ','').replace('],', '').strip('[ ]'))
演示:
In [86]: x
Out[86]: array([0, 1, 2, 3, 4])
In [87]: y
Out[87]: array([ 0, 1, 4, 9, 16])
In [85]: print(np.array2string(np.column_stack((x, y)),separator=',').replace(' [ ','').replace('],', '').strip('[ ]'))
0, 0
1, 1
2, 4
3, 9
4,16
答案 3 :(得分:0)
有两个问题 - 组合2个数组,并打印结果
In [1]: a = np.arange(4)
In [2]: b = a**2
In [3]: ab = [a,b] # join arrays in a simple list
In [4]: ab
Out[4]: [array([0, 1, 2, 3]), array([0, 1, 4, 9])]
In [6]: list(zip(*ab)) # 'transpose' that list
Out[6]: [(0, 0), (1, 1), (2, 4), (3, 9)]
zip(*)
是一个有用的工具或习惯用法。
我可以使用您的print(*a, sep...)
方法
In [11]: print(*list(zip(*ab)), sep='\n')
(0, 0)
(1, 1)
(2, 4)
(3, 9)
使用sep
是一个简洁的py3
技巧,但很少使用。我甚至不确定如何使用旧的py2打印语句来执行等效操作。
但是如果我们将数组列表转换为2d数组,我们有更多的选择。
In [12]: arr = np.array(ab)
In [13]: arr
Out[13]:
array([[0, 1, 2, 3],
[0, 1, 4, 9]])
In [14]: np.vstack(ab) # does the same thing
Out[14]:
array([[0, 1, 2, 3],
[0, 1, 4, 9]])
为了简单地查看2个数组,arr
非常有用。如果线条太长,则转置它:
In [15]: arr.T
Out[15]:
array([[0, 0],
[1, 1],
[2, 4],
[3, 9]])
In [16]: print(arr.T)
[[0 0]
[1 1]
[2 4]
[3 9]]
请注意,阵列打印格式与嵌套列表的格式不同。这是故意的。
括号很少妨碍理解显示。他们甚至帮助阵列变成3d和更高。
要打印可由其他程序读取的文件,np.savetxt
非常有用。它允许我指定分隔符,以及每个列或行的格式。
In [17]: np.savetxt('test.csv', arr.T, delimiter=',',fmt='%10d')
在ipython
中,我可以通过简单的系统调用来查看文件:
In [18]: cat test.csv
0, 0
1, 1
2, 4
3, 9
我可以省略delimiter
参数。
我可以使用loadtxt
In [20]: np.loadtxt('test.csv',delimiter=',',dtype=int)
Out[20]:
array([[0, 0],
[1, 1],
[2, 4],
[3, 9]])
在Py3中,很难将savetxt
写入屏幕。它在字节字符串文件上运行,sys.stdout
是unicode。在Py2中np.savetxt(sys.stdout, ...)
可能有用。
savetxt
并不复杂。在这个例子中,它基本上是fwrite
等价于:
In [21]: for row in arr.T:
...: print('%10d,%10d'%tuple(row))
...:
0, 0
1, 1
2, 4
3, 9