我有一个1700个值的数组(msaarr),范围从大约0到150。我知道这些值中的894个应小于2,我希望创建一个仅包含这些值的新数组。

到目前为止,我已经尝试了以下代码:

Combined = np.zeros(shape=(894,8))

for i in range(len(Spitzer)):         #len(Spitzer) = 1700
    index = np.where(msaarr <= 2)
    Combined[:,0] = msaarr[index]


之所以有八列,是因为我还有更多要与msaarr中的每个值关联的数据。 msaarr是使用几行代码创建的,这就是为什么我在这里没有提到它们的原因,但是它是一个形状为(1700,1)且类型为float64的数组。

我遇到的问题是,如果我打印msaarr [index],则得到一个形状数组(893,),但是当我尝试将其分配为第零列时,出现错误

ValueError: could not broadcast input array from shape (1699) into shape (894)


我也尝试过

Combined[:,0] = np.extract(msaarr <= 2, msaarr)


这给了同样的错误。

我认为起初这可能与Python的零索引有些混淆,所以我尝试将形状更改为893,还尝试将其分配给其他列Combined [:,1],但每次都遇到相同的错误。

另外,当我尝试:

Combined[:,1][i] = msaarr[index][i]


我得到错误:

IndexError: index 894 is out of bounds for axis 0 with size 894


我究竟做错了什么?

编辑:

一个朋友指出,由于它是一个元组,所以我可能无法正确调用索引,因此他的建议是:

index = np.where(msaarr < 2)
Combined[:,0] = msaarr[index[0][:]]


但我仍然收到此错误:

ValueError: could not broadcast input array from shape (893,1) into shape (893)


我的形状怎么会是(893)而不是(893,1)?

另外,我检查了,len(index [0] [:])= 893,len(msaarr [index [0] [:]])= 893。

截至上次尝试的完整代码为:

import numpy as np
from astropy.io import ascii
from astropy.io import fits

targets = fits.getdata('/Users/vcolt/Dropbox/ATLAS source matches/OzDES.fits')
Spitzer = ascii.read(r'/Users/vcolt/Desktop/Catalogue/cdfs_spitzer.csv', header_start=0, data_start=1)

## Find minimum separations, indexed.
RADiffArr = np.zeros(shape=(len(Spitzer),1))
DecDiffArr = np.zeros(shape=(len(Spitzer),1))
msaarr = np.zeros(shape=(len(Spitzer),1))
Combined= np.zeros(shape=(893,8))

for i in range(len(Spitzer)):
    x = Spitzer["RA_IR"][i]
    y = Spitzer["DEC_IR"][i]
    sep = abs(np.sqrt(((x - targets["RA"])*np.cos(np.array(y)))**2 + (y - targets["DEC"])**2))
    minsep = np.nanmin(sep)
    minseparc = minsep*3600
    msaarr[i] = minseparc
    min_positions = [j for j, p in enumerate(sep) if p == minsep]
    x2 = targets["RA"][min_positions][0]
    RADiff = x*3600 - x2*3600
    RADiffArr[i] = RADiff
    y2 = targets["DEC"][min_positions][0]
    DecDiff = y*3600 - y2*3600
    DecDiffArr[i] = DecDiff

index = np.where(msaarr < 2)
print msaarr[index].shape
Combined[:,0] = msaarr[index[0][:]]


无论index = np.where(msaarr

最佳答案

看一下将numpy.takenumpy.where结合使用。

inds = np.where(msaarr <= 2)
new_msaarr = np.take(msaarr, inds)


如果它是多维数组,则还可以添加axis关键字以沿该轴获取切片。

10-04 15:48