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

Arrays 打印两个numpy阵列的简单方法,每个元素位于不同的行中?,arrays,python-3.x,numpy,Arrays,Python 3.x,Numpy,假设我有一个1D 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)

假设我有一个1D 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

>>>

你可以做些类似的事情-

# 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\u 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]

或者如果一些快速和肮脏的东西足够了:

print(np.array((x,y)).T)

这里有一种没有循环的方法:

print(np.array2string(np.column_stack((x, y)),separator=',').replace(' [ ','').replace('],', '').strip('[ ]'))
演示:


有两个问题-组合两个数组并打印结果

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
技巧,但很少使用。我甚至不知道如何使用较旧的Py2Print语句执行等效操作

但是如果我们将数组列表转换为二维数组,我们就有了更多的选择

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]])
为了简单地同时查看两个阵列,此
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
我可以省略
分隔符
参数

我可以用
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

那个循环有什么困难?你需要多少控制?无论有无括号、逗号等。我可能会在zip(x,y)中使用xy的
@hpaulj这并不是因为它很难,而是因为我发现它对于一项应该很容易完成的任务来说很麻烦。例如,如果要在打印后添加空行,则必须使用print()命令添加另一行。我发现使用一行(短)命令来打印两个列表会很好。定义这样做的函数很容易,但我想知道是否有人能告诉我们如何做到这一点。我想让它打印用空格分隔的数字,这样我就可以用另一个程序来打印它们。那么你真的想写入文件吗?不只是打印到屏幕上?你有没有看过
np.savetxt
?有时我希望在保存到文件之前将其打印到屏幕上(以检查输出);然后,如果我想保存它,很容易将输出重定向到文件。否则,在运行程序之前,我需要有文件名,如果我想检查输出,请打开文件。无论是哪种方式,请学习使用list
zip
numpy
连接/堆栈函数连接两个数组。
In [21]: for row in arr.T:
    ...:     print('%10d,%10d'%tuple(row))
    ...:     
         0,         0
         1,         1
         2,         4
         3,         9