簡體   English   中英

使用numpy並排打印兩個數組

[英]Print two arrays side by side using 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 循環來做到這一點,但我不確定如何讓它發揮作用。 目前,我有 .

有什么建議嗎?

假設你有:

>>> 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代替。

您可以使用 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)])

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]

使用 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 應用程序很有用。 這決定了神經網絡訓練的有效性。 這是一種檢測網絡計算中錯誤位置的快速方法。

你很接近 - 但如果你迭代角度,只需生成該角度的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 乘以 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))

或者您可以使用savetxt將其寫入csv樣式文件(它只是遍歷二維數組的“行”並使用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 中遇到 byte v unicode 字符串問題。

只是在有一些格式想法的 numpy 中,使用 @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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM