如何像在fortran中那样以连续零可以写为n * 0的格式声明数组?

时间:2018-07-20 23:07:26

标签: python arrays python-3.x numpy

我有一个类型为

的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格式的数组,而不仅仅是表示形式。

4 个答案:

答案 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代码及其输出。

  

通过http://rextester.com/AJDEUE76668

在线试用
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]