Arrays 打印两个numpy阵列的简单方法,每个元素位于不同的行中?
假设我有一个1D 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)
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。在Py2np.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
?有时我希望在保存到文件之前将其打印到屏幕上(以检查输出);然后,如果我想保存它,很容易将输出重定向到文件。否则,在运行程序之前,我需要有文件名,如果我想检查输出,请打开文件。无论是哪种方式,请学习使用listzip
或numpy
连接/堆栈函数连接两个数组。
In [21]: for row in arr.T:
...: print('%10d,%10d'%tuple(row))
...:
0, 0
1, 1
2, 4
3, 9