使用numpy数组格式化打印语句



我正试图根据它们的顺序打印两个numpy数组。我正在尝试在没有for循环的情况下执行此函数。我不知道该怎么做。我本质上想把普通的Python版本变成numpy形式

a = np.arange(0, 15, 1)
b = np.arange(0, 150, 10)

香草Python版本

for i in range(len(a)):
print("when a is", a[i], "b is", b[i])

预期输出:

when a is 1 b is 10
when a is 2 b is 20
when a is 3 b is 30
...

我写这个冗长的答案是因为我怀疑你不太理解"无循环";当使用CCD_ 1时。

所以你有两个相同长度的阵列:

In [256]: a = np.arange(0,15,1)
...: b = np.arange(0,150,10)
In [257]: a
Out[257]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
In [258]: b
Out[258]: 
array([  0,  10,  20,  30,  40,  50,  60,  70,  80,  90, 100, 110, 120,
130, 140])
In [259]: a.shape
Out[259]: (15,)
In [260]: b.shape
Out[260]: (15,)

每对的直接打印-如果ab是列表而不是数组,这甚至会更快,但实时限制是打印,而不是迭代。(为了方便起见,我使用了新的f格式。)

In [261]: for i,j in zip(a,b):print(f'when a is {i}, b is {j}')
when a is 0, b is 0
when a is 1, b is 10
when a is 2, b is 20
....
when a is 13, b is 130
when a is 14, b is 140

我们可以从两个阵列中制作一个二维阵列:

In [262]: np.array((a,b))
Out[262]: 
array([[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
13,  14],
[  0,  10,  20,  30,  40,  50,  60,  70,  80,  90, 100, 110, 120,
130, 140]])

如果你喜欢列显示:

In [263]: np.array((a,b)).T
Out[263]: 
array([[  0,   0],
[  1,  10],
[  2,  20],
[  3,  30],
...
[ 13, 130],
[ 14, 140]])

这就形成了一个(15,2)数组。构造这样一个数组还有其他几种方法。

虽然总体布局与您的打印相匹配,但包括所有额外的文本将需要更多的工作。numpy没有针对字符串工作进行优化;这是一个数字工具。如果你想要花哨的格式,请使用python循环。

np.savetxt写入csv文件。它对行进行迭代,并对每一行进行格式化写入,如:

In [268]: for row in Out[263]: print('When a is %d, b is %d'%tuple(row))
When a is 0, b is 0
When a is 1, b is 10
When a is 2, b is 20
When a is 3, b is 30
In [270]: np.savetxt('test.txt', Out[263], fmt='when a is %d, b is %d')
In [271]: cat test.txt
when a is 0, b is 0
when a is 1, b is 10
when a is 2, b is 20
when a is 3, b is 30

使用ab创建一个新数组,然后使用numpy0:

a = np.arange(0,15,1)
b = np.arange(0,150,10)
c = np.array([a, b])
np.apply_along_axis(lambda x: print(f'when a is {x[0]} b is {x[1]}'), 0, c)

输出:

when a is 0 b is 0
when a is 1 b is 10
when a is 2 b is 20
when a is 3 b is 30
when a is 4 b is 40
...

顺便说一句,我认为print不是这个函数的正确用法——它返回了一系列None的s。如果需要一系列字符串,请删除print

for循环到底出了什么问题?

如果你真的不想使用for循环,那么

import numpy as np
a = np.arange(0, 15, 1)
b = np.arange(0, 150, 10)
text_1 = np.array(['what a is']*len(a))
text_2 = np.array(['b is']*len(a))
print(np.array([text_1, a, text_2, b]).transpose())

会起作用,但到处都是引号。请注意,只有当a和b的长度相同时,它才会起作用。您可以使用np.set_printoptions来精确格式化它的外观。

最新更新