web-dev-qa-db-ja.com

TypeError:1つの要素を持つ整数配列のみがインデックス3に変換できます

タイトルにこのエラーがありますが、何が問題なのかわかりません。 np.appendの代わりにnp.hstackを使用すると動作しますが、これをより速くしたいので、appendを使用します。

time_list-フロートのリスト

heightsはfloatの1d np.arrayです

j = 0
n = 30
time_interval = 1200
axe_x = []

while j < np.size(time_list,0)-time_interval:
    if (not np.isnan(heights[j])) and (not np.isnan(heights[j+time_interval])):
        axe_x.append(time_list[np.arange(j+n,j+(time_interval-n))])

 File "....", line .., in <module>
    axe_x.append(time_list[np.arange(j+n,j+(time_interval-n))])

TypeError: only integer arrays with one element can be converted to an index
25
GeoffreyB

問題は、エラーが示すように、_time_list_は通常のpythonリストであるため、別のリストを使用してインデックスを作成することはできません(他のリストが単一要素の配列でない限り) 。例-

_In [136]: time_list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]

In [137]: time_list[np.arange(5,6)]
Out[137]: 6

In [138]: time_list[np.arange(5,7)]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-138-ea5b650a8877> in <module>()
----> 1 time_list[np.arange(5,7)]

TypeError: only integer arrays with one element can be converted to an index
_

そのようなインデックスを作成する場合は、_time_list_を_numpy.array_にする必要があります。例-

_In [141]: time_list = np.array(time_list)

In [142]: time_list[np.arange(5,6)]
Out[142]: array([6])

In [143]: time_list[np.arange(5,7)]
Out[143]: array([6, 7])
_

もう1つ注意すべきことは、whileループではjを増やすことはないので、無限ループになる可能性があることです。また、jをある程度(おそらく_time_interval_?)。


しかし、コメントで投稿した要件によると-

axe_xは、time_listリストから生成されたfloatの1d配列でなければなりません

.extend()の代わりに.append()を使用する必要があります。_.append_は配列のリストを作成します。ただし、1D配列が必要な場合は、.extend()を使用する必要があります。例-

_time_list = np.array(time_list)
while j < np.size(time_list,0)-time_interval:
    if (not np.isnan(heights[j])) and (not np.isnan(heights[j+time_interval])):
        axe_x.extend(time_list[np.arange(j+n,j+(time_interval-n))])
        j += time_interval           #Or what you want to increase it by.
_
39
Anand S Kumar