打印两个numpy阵列的简单方法,每个元素在不同的行中?

时间:2016-11-13 18:23:16

标签: arrays python-3.x numpy

假设我有一个numpy数组x和另一个y = x ** 2。 我正在寻找一个更容易的替代

for i in range(x.size):
    print(x[i], y[i])

使用一个数组,可以执行print(*x, sep = '\n'),这比for循环更容易。我正在考虑将xy转换为字符串数组,然后将它们添加到数组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

>>>

4 个答案:

答案 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