簡體   English   中英

具有多個元素的數組的Pyplot真值不明確

[英]Pyplot truth value of an array with more than one element is ambiguous

我正在嘗試實施knn一維估算:

# nearest neighbors estimate
def nearest_n(x, k, data):
    # Order dataset
    #data = np.sort(data, kind='mergesort')
    nnb = []
    # iterate over all data and get k nearest neighbours around x
    for n in data:
        if nnb.__len__()<k:
            nnb.append(n)
        else:
            for nb in np.arange(0,k):
                if np.abs(x-n) < np.abs(x-nnb[nb]):
                    nnb[nb] = n
                    break

    nnb = np.array(nnb)
    # get volume(distance) v of k nearest neighbours around x
    v = nnb.max() - nnb.min()
    v = k/(data.__len__()*v)

    return v

interval = np.arange(-4.0, 8.0, 0.1)
plt.figure()
for k in (2,8,35):
    plt.plot(interval, nearest_n(interval, k,train_data), label=str(o))
plt.legend()
plt.show()

哪個拋出:

  File "x", line 55, in nearest_n
    if np.abs(x-n) < np.abs(x-nnb[nb]):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我知道錯誤來自plot()中的數組輸入,但是我不確定如何在具有運算符> / == / <的函數中避免這種情況

“數據”來自包含浮點數的一維txt文件。

我嘗試使用向量化:

nearest_n = np.vectorize(nearest_n)

結果是:

line 50, in nearest_n
    for n in data:
TypeError: 'numpy.float64' object is not iterable

這是一個例子,假設:

data = [0.5,1.7,2.3,1.2,0.2,2.2]
k = 2

最接近的(1.5)應該導致

nbb=[1.2,1.7]
v = 0.5 

並返回2 /(6 * 0.5)= 2/3

該函數例如運行neares_n(2.0,4,data)並給出0.0741586011463

您正在傳遞np.arange(-4, 8, .01)作為x ,它是一個值數組。 因此x - n是與x長度相同的數組,在這種情況下為120個元素,因為數組和標量的減法是逐元素的減法。 nnb[nb]相同。 因此,比較的結果是一個具有布爾值的120個長度的數組,具體取決於np.abs(xn)每個元素是否小於np.abs(x-nnb[nb])的相應元素。 這不能直接用作條件,您需要將這些值合並為單個布爾值(使用all()any()或只是重新考慮代碼)。

plt.figure()
X = np.arange(-4.0,8.0,0.1)
for k in [2,8,35]:
    Y = []
    for n in X:
        Y.append(nearest_n(n,k,train_data))
    plt.plot(X,Y,label=str(k))
plt.show()

工作正常。 我以為pyplot.plot已經可以為我做這件事了,但是我想它不會...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM