使用numpy并排打印两个数组

时间:2016-11-05 22:26:07

标签: python numpy

我试图在python中使用numpy创建一个余弦表。我想在角度的余弦旁边有角度,所以它看起来像这样:

0.0    1.000  5.0    0.996  10.0    0.985  15.0 0.966
20.0   0.940  25.0   0.906 and so on. 

我尝试使用for循环但是我不确定如何让它工作。 目前,我有

有什么建议吗?

6 个答案:

答案 0 :(得分:5)

假设你有:

>>> d = np.linspace(0, 360, 10, endpoint=False)
>>> c = np.cos(np.radians(d))

如果你不介意在侧面有一些括号等,那么你可以简单地使用np.c_按列连接,并显示:

>>> print(np.c_[d, c])
[[  0.00000000e+00   1.00000000e+00]
 [  3.60000000e+01   8.09016994e-01]
 [  7.20000000e+01   3.09016994e-01]
 [  1.08000000e+02  -3.09016994e-01]
 [  1.44000000e+02  -8.09016994e-01]
 [  1.80000000e+02  -1.00000000e+00]
 [  2.16000000e+02  -8.09016994e-01]
 [  2.52000000e+02  -3.09016994e-01]
 [  2.88000000e+02   3.09016994e-01]
 [  3.24000000e+02   8.09016994e-01]]

但如果您关心删除它们,一种可能性是使用简单的正则表达式:

>>> import re
>>> print(re.sub(r' *\n *', '\n',
                 np.array_str(np.c_[d, c]).replace('[', '').replace(']', '').strip()))
0.00000000e+00   1.00000000e+00
3.60000000e+01   8.09016994e-01
7.20000000e+01   3.09016994e-01
1.08000000e+02  -3.09016994e-01
1.44000000e+02  -8.09016994e-01
1.80000000e+02  -1.00000000e+00
2.16000000e+02  -8.09016994e-01
2.52000000e+02  -3.09016994e-01
2.88000000e+02   3.09016994e-01
3.24000000e+02   8.09016994e-01

我正在删除括号,然后将其传递给正则表达式以删除每行中任意一行的空格。

np.array_str还可以设置精度。要获得更多控制权,您可以使用np.array2string代替。

答案 1 :(得分:2)

您可以使用python的zip函数同时浏览两个列表的元素。

import numpy as np
degreesVector = np.linspace(0.0, 360.0, 73.0)
cosinesVector = np.cos(np.radians(degreesVector))
for d, c in zip(degreesVector, cosinesVector):
    print d, c

如果你想用度和余弦值制作一个numpy数组,你可以用这种方式修改for循环:

table = []
for d, c in zip(degreesVector, cosinesVector):
    table.append([d, c])
table = np.array(table)

现在在一条线上!

np.array([[d, c] for d, c in zip(degreesVector, cosinesVector)])

答案 2 :(得分:2)

Pandas是这类任务非常方便的模块:

In [174]: import pandas as pd
     ...:
     ...: x = pd.DataFrame({'angle': np.linspace(0, 355, 355//5+1),
     ...:                   'cos': np.cos(np.deg2rad(np.linspace(0, 355, 355//5+1)))})
     ...:
     ...: pd.options.display.max_rows = 20
     ...:
     ...: x
     ...:
Out[174]:
    angle       cos
0     0.0  1.000000
1     5.0  0.996195
2    10.0  0.984808
3    15.0  0.965926
4    20.0  0.939693
5    25.0  0.906308
6    30.0  0.866025
7    35.0  0.819152
8    40.0  0.766044
9    45.0  0.707107
..    ...       ...
62  310.0  0.642788
63  315.0  0.707107
64  320.0  0.766044
65  325.0  0.819152
66  330.0  0.866025
67  335.0  0.906308
68  340.0  0.939693
69  345.0  0.965926
70  350.0  0.984808
71  355.0  0.996195

[72 rows x 2 columns]

答案 3 :(得分:1)

使用Numpy进行并排数组比较

使用column_stack((...))方法的内置Numpy方法。

numpy.column_stack((A, B)) 是带有Numpy的列堆栈,可用于比较两个或多个矩阵/数组。

对元组使用numpy.column_stack((A, B))方法。元组必须用()括号表示,该括号用所需的矩阵/数组表示单个参数。

import numpy as np

A = np.random.uniform(size=(10,1))
B = np.random.uniform(size=(10,1))
C = np.random.uniform(size=(10,1))

np.column_stack((A, B, C)) ## <-- Compare Side-by-Side

结果如下:

array([[0.40323596, 0.95947336, 0.21354263],
       [0.18001121, 0.35467198, 0.47653884],
       [0.12756083, 0.24272134, 0.97832504],
       [0.95769626, 0.33855075, 0.76510239],
       [0.45280595, 0.33575171, 0.74295859],
       [0.87895151, 0.43396391, 0.27123183],
       [0.17721346, 0.06578044, 0.53619146],
       [0.71395251, 0.03525021, 0.01544952],
       [0.19048783, 0.16578012, 0.69430883],
       [0.08897691, 0.41104408, 0.58484384]])

在将预测结果与预期答案进行比较时,Numpy column_stack对于AI / ML应用很有用。这决定了神经网络训练的有效性。这是一种检测网络计算中错误的快速方法。

答案 4 :(得分:0)

使用@MaxU的语法

,只需要一些格式的想法
a = np.array([[i, np.cos(np.deg2rad(i)), np.sin(np.deg2rad(i))]
               for i in range(0,361,30)])
args = ["Angle", "Cos", "Sin"]
frmt = ("{:>8.0f}"+"{:>8.3f}"*2)
print(("{:^8}"*3).format(*args))
for i in a:
    print(frmt.format(*i))
 Angle    Cos     Sin   
       0   1.000   0.000
      30   0.866   0.500
      60   0.500   0.866
      90   0.000   1.000
     120  -0.500   0.866
     150  -0.866   0.500
     180  -1.000   0.000
     210  -0.866  -0.500
     240  -0.500  -0.866
     270  -0.000  -1.000
     300   0.500  -0.866
     330   0.866  -0.500
     360   1.000  -0.000

答案 5 :(得分:0)

你很接近 - 但如果你在角度上迭代,只需为该角度生成cosine

In [293]: for angle in range(0,60,10):
     ...:     print('{0:8}{1:8.3f}'.format(angle, np.cos(np.radians(angle))))
     ...:     
       0   1.000
      10   0.985
      20   0.940
      30   0.866
      40   0.766
      50   0.643

要使用数组,您有很多选择:

In [294]: angles=np.linspace(0,60,7)
In [295]: cosines=np.cos(np.radians(angles))

遍历索引:

In [297]: for i in range(angles.shape[0]):
     ...:     print('{0:8}{1:8.3f}'.format(angles[i],cosines[i]))

使用zip逐个输出值2:

for a,c in zip(angles, cosines):
    print('{0:8}{1:8.3f}'.format(a,c))

略有变化:

for ac in zip(angles, cosines):
     print('{0:8}{1:8.3f}'.format(*ac))

您可以将数组连接成一个二维数组,并显示:

In [302]: np.vstack((angles, cosines)).T
Out[302]: 
array([[  0.        ,   1.        ],
       [ 10.        ,   0.98480775],
       [ 20.        ,   0.93969262],
       [ 30.        ,   0.8660254 ],
       [ 40.        ,   0.76604444],
       [ 50.        ,   0.64278761],
       [ 60.        ,   0.5       ]])

In [318]: print(np.vstack((angles, cosines)).T)
[[  0.           1.        ]
 [ 10.           0.98480775]
 [ 20.           0.93969262]
 [ 30.           0.8660254 ]
 [ 40.           0.76604444]
 [ 50.           0.64278761]
 [ 60.           0.5       ]]

np.column_stack可以在没有转置的情况下做到这一点。

您可以使用以下命令将该数组传递给您的格式:

for ac in np.vstack((angles, cosines)).T:
    print('{0:8}{1:8.3f}'.format(*ac))

或者您可以使用csv将其写入savetxt样式文件(它只会迭代2d数组的&#39;行并使用fmt进行写入) :

In [310]: np.savetxt('test.txt', np.vstack((angles, cosines)).T, fmt='%8.1f  %8.3f')
In [311]: cat test.txt
     0.0     1.000
    10.0     0.985
    20.0     0.940
    30.0     0.866
    40.0     0.766
    50.0     0.643
    60.0     0.500

不幸的是savetxt需要旧样式格式。并尝试写入sys.stdout会在Py3中遇到字节v unicode字符串问题。