【问题标题】:How to append a selection of a numpy array to an empty numpy array如何将一个 numpy 数组的选择附加到一个空的 numpy 数组
【发布时间】:2017-07-22 15:30:16
【问题描述】:

我有三个 .txt 文件,我已成功地将它们制作成一个 numpy 数组。如果您好奇,这些文件是来自高级组合实验 (ACE) 的 Level 2 数据。特定文件位于 MAG 和 SEPAM 部分,分别为 16 秒平均和 64 秒平均。坚果壳中的数据代表入站粒子场的 z 分量磁场、通过单位面积计数测量的成分及其速度。目前研究的重点是入站氢,但我离题了。下面提供了我用来读取和保存文件(以及修复任何错误)的代码:

Bz = np.loadtxt(r"/home/ary/Desktop/Arya/Project/Data/AC/MAG/ACE_MAG_Data_SEPT_18_2015.txt", dtype = bytes).astype(float)
SWEPAM_HV = np.loadtxt(r"/home/ary/Desktop/Arya/Project/Data/ACE/SWEPAM/Proton_Density/ACE_SWEPAM_H_Density_20150918.txt", dtype = bytes).astype(float)
SWEPAM_HD = np.loadtxt(r"/home/ary/Desktop/Arya/Project/Data/ACE/SWEPAM/Proton_Speed/ACE_SWEPAM_H_Velocity_20150918.txt",dtype = bytes).astype(float)

Bz = np.ma.masked_array(Bz, Bz <= -999, fill_value = 0)
SWEPAM_HD = np.ma.masked_array(SWEPAM_HD, SWEPAM_HD <= -999, fill_value = 0)
SWEPAM_HV = np.ma.masked_array(SWEPAM_HV, SWEPAM_HV <= -999, fill_value = 0)

Mag_time = np.arange(0,86400, 16, dtype = float)
SWEPAM_time = np.arange(0,86400,64, dtype = float)

但是,在这些数组中,我只对第 1349 位到第 2024 位特别感兴趣。这些数字很有趣,因为我对这两点之间发生的异常情况进行了调查。所以我认为以下内容将引导我走向成功。它没有,许多变体也失败了。我向您展示我现在拥有的最新脚本:

Mag_time_prime = np.array([])
Bz_prime = np.array([])
for i in range(1349,2024):
    append(Mag_time_prime,Mag_time[i]).astype(float)
    append(Bz_prime,Bz[i]).astype(float)
print(Mag_time_prime.shape)
print(Bz_prime.shape)

我已经想到,通过制作空数组(我确实尝试np.empty(0) 作为素数,但无法让它为我工作),我可以创建一个 for 循环来定位并附加 i_th 位置BzMag_time 到指定范围内的空“prime”数组。然而,“主要”数组不断弹出空数组。所以我的问题是,我哪里出错了,我应该如何解决?

【问题讨论】:

  • 不要使用numpy.append。如果必须追加,请使用列表。如果您必须使用数组附加,请按照文档使用它,
  • 我怎么没有按预期使用numpy.append?文档说第一个位置是您要附加到的列表,第二个位置是您希望附加到该列表的值。我要附加的列表是质数之一,我希望附加到它的值是相应数组的第 i_th 位置。
  • np.append返回一个值,即2个数组的串联。 alist.append() 更改 alist(就地)。这就是我说不要使用它的重要原因。人们错误地使用它,就好像它是一个列表追加。
  • 哦,你的意思是空数组(任何素数数组)与任何其他数组的串联仍然会返回一个空数组?类似地讲,是不是类似于将0向量点到任意向量中得到0向量?

标签: python arrays numpy append


【解决方案1】:

列表追加作用于列表本身:

In [1]: alist = []
In [2]: alist.append(5)
In [3]: alist.append(3)
In [4]: alist
Out[4]: [5, 3]

np.append 不会改变它的参数:

In [5]: arr = np.array([])
In [6]: np.append(arr,1)
Out[6]: array([ 1.])
In [7]: np.append(arr,2)
Out[7]: array([ 2.])
In [8]: arr
Out[8]: array([], dtype=float64)

您必须将 append 的值分配回 arr 以获得列表等效行为:

In [9]: arr=np.append(arr,1)
In [10]: arr=np.append(arr,2)
In [11]: arr
Out[11]: array([ 1.,  2.])

每次使用np.append 时,都会创建一个新副本(它使用np.concatenate)。一两次就可以了,但是反复做就没有效率了。

首选的方法是使用列表追加来构建一个列表,然后从中创建一个数组:

In [12]: np.array(alist)
Out[12]: array([5, 3])

您必须先了解np.concatenate,然后才能正确使用np.append。它是列表附加的不良替代品。

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2020-12-21
    • 2022-01-09
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多