[英]Element wise mean of numpy arrays of different sizes
因此,我正在閱讀一個 csv 文件,其中我關注的是 col3,其中行具有不同長度的值,最初它被讀取為 str 類型,但使用 pd.eval 進行了修復。
df = pd.read_csv('datafile.csv', converters={'col3': pd.eval})
row e.g. [0, 100, -200, 300, -150...]
有許多不同大小的行,我想計算元素明智的平均值,我已經遵循了這個解決方案。 我首先遇到了 Numpy VisibleDeprecationWarning 錯誤,我使用它修復了該錯誤。 但是對於使用 np.nanmean 的解決方案的最后一步,我遇到了一個新錯誤,即
ValueError:具有多個元素的數組的真值不明確。 使用 a.any() 或 a.all()
到目前為止,我的代碼看起來像這樣:
import pandas as pd
import numpy as np
import itertools
df = pd.read_csv('datafile.csv', converters={'col3': pd.eval})
datafile = df[(df['col1'] == 'Red') & (df['col2'] == Name) & ((df['col4'] == 'EX') | (df['col5'] == 'EX'))]
np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning)
ar = np.array(list(itertools.zip_longest(df['col3'], fillvalue=np.nan)))
print(ar)
np.nanmean(ar,axis=1)
如果指向 arrays 類型為 object,我可以看到該錯誤,但我不確定如何修復它。
制作一個參差不齊的數組:
In [23]: arr = np.array([np.arange(5), np.ones(5),np.zeros(3)],object)
In [24]: arr
Out[24]:
array([array([0, 1, 2, 3, 4]), array([1., 1., 1., 1., 1.]),
array([0., 0., 0.])], dtype=object)
注意形狀和數據類型。
嘗試對它使用 mean :
In [25]: np.mean(arr)
Traceback (most recent call last):
Input In [25] in <cell line: 1>
np.mean(arr)
File <__array_function__ internals>:180 in mean
File /usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py:3432 in mean
return _methods._mean(a, axis=axis, dtype=dtype,
File /usr/local/lib/python3.10/dist-packages/numpy/core/_methods.py:180 in _mean
ret = umr_sum(arr, axis, dtype, out, keepdims, where=where)
ValueError: operands could not be broadcast together with shapes (5,) (3,)
將均值應用於每個元素數組有效:
In [26]: [np.mean(a) for a in arr]
Out[26]: [2.0, 1.0, 0.0]
嘗試使用 zip_longest:
In [27]: import itertools
In [28]: list(itertools.zip_longest(arr))
Out[28]:
[(array([0, 1, 2, 3, 4]),),
(array([1., 1., 1., 1., 1.]),),
(array([0., 0., 0.]),)]
沒變。 我們可以通過解壓 arr 來使用它——但它以錯誤的方式填充了 arrays:
In [29]: list(itertools.zip_longest(*arr))
Out[29]: [(0, 1.0, 0.0), (1, 1.0, 0.0), (2, 1.0, 0.0), (3, 1.0, None), (4, 1.0, None)]
zip_longest
可用於填充列表,但比這需要更多考慮。
如果我們從該列表中創建一個數組:
In [35]: np.array(list(itertools.zip_longest(*arr,fillvalue=np.nan)))
Out[35]:
array([[ 0., 1., 0.],
[ 1., 1., 0.],
[ 2., 1., 0.],
[ 3., 1., nan],
[ 4., 1., nan]])
並轉置它,我們可以采用nanmean
:
In [39]: np.array(list(itertools.zip_longest(*arr,fillvalue=np.nan))).T
Out[39]:
array([[ 0., 1., 2., 3., 4.],
[ 1., 1., 1., 1., 1.],
[ 0., 0., 0., nan, nan]])
In [40]: np.nanmean(_, axis=1)
Out[40]: array([2., 1., 0.])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.