我有一个类型为
的fortran数组 DATA ELEV \1.2,3.2,2*0.0,3.9,3*0.0\
在python中应该是
ELEV = [1.2, 3.2, 0.0, 0.0, 3.9, 0.0, 0.0, 0.0]
请注意2 * 0.0不是0.0,而是2个值为0.0的元素。
是否可以使用numpy或其他python方法(或库)在python3中类似地编写?
我本质上具有要在我的python代码中使用的fortran格式的数组,而不仅仅是表示形式。
答案 0 :(得分:3)
使用new *
unpacking generalizations并列出乘法。
>>> [1.2, 3.2, *2*[0.0], 3.9, *3*[0.0]]
[1.2, 3.2, 0.0, 0.0, 3.9, 0.0, 0.0, 0.0]
您还可以在Python中将字符串和元组相乘。
>>> 'abc'*3
'abcabcabc'
>>> (1, 2, 3)*2
(1, 2, 3, 1, 2, 3)
您可以解开所有可迭代的文件,这在元组显示等中也适用。
>>> (1.2, 3.2, *'xy'*2, 3.9, *3*(0.0,), *'foo')
(1.2, 3.2, 'x', 'y', 'x', 'y', 3.9, 0.0, 0.0, 0.0, 'f', 'o', 'o')
答案 1 :(得分:2)
Python的内置列表已经具有非常相似的功能:
[1.2, 3.2] + [0.0] * 2 + [3.9] + [0.0] * 3
产生
[1.2, 3.2, 0.0, 0.0, 3.9, 0.0, 0.0, 0.0]
答案 2 :(得分:0)
也许在numpy
中最自然的方法是使用repeat
函数/方法:
In [252]: a = np.array([1.2,3.2,0,3.9,0])
In [253]: b = a.repeat([1,1,2,1,3])
In [254]: b
Out[254]: array([1.2, 3.2, 0. , 0. , 3.9, 0. , 0. , 0. ])
或者如果有很多0,则将非零值复制到零数组中
In [255]: c = np.zeros(8, float)
In [256]: c[[0,1,4]] = [1.2,3.2,3.9]
In [257]: c
Out[257]: array([1.2, 3.2, 0. , 0. , 3.9, 0. , 0. , 0. ])
答案 3 :(得分:-1)
@fireball ,我认为最好有一个可重用的代码块(函数)。
这里是 get_nums(),其中包含2个参数。
第一个参数 n 是我们要重复的数字,第二个参数 freq 表示频率为 n 。
函数返回一个包含 n , freq 次的列表,我们使用 * 在调用语句中对其进行解包。
这里您不需要反复使用 + 运算符,并将列表分成多个子列表,如下所示。
[65,54] + [0.0] * 5 + [6,9]
请查看下面的python代码及其输出。
在线试用
def get_nums(n, freq):
l = [n] * freq
return l
# TEST CASE 1
ELEV = [1.2, 3.2, *get_nums(0.0, 2) ,3.9, *get_nums(0.0, 3)]
print(ELEV)
print() # newline
# TEST CASE 2
arr = [45, *get_nums(1, 4), *get_nums(9, 3), 34, 99, *get_nums(7, 1), 12, 21, *get_nums(-1, 5)]
print(arr)
[1.2, 3.2, 0.0, 0.0, 3.9, 0.0, 0.0, 0.0]
[45, 1, 1, 1, 1, 9, 9, 9, 34, 99, 7, 12, 21, -1, -1, -1, -1, -1]