piR*_*red 14 python numpy pandas
我将在前面加上声明,我首先不会这样做,并且我遇到了这个帮助朋友的事.
考虑数据框架 df
df = pd.DataFrame(pd.Series([[1.2]]))
df
0
0 [1.2]
Run Code Online (Sandbox Code Playgroud)
这是对象是列表的对象的数据框.在我朋友的代码中,他们有:
df.astype(float)
Run Code Online (Sandbox Code Playgroud)
正如我所希望的那样打破了
Run Code Online (Sandbox Code Playgroud)ValueError: setting an array element with a sequence.
但是,如果这些值是numpy数组:
df = pd.DataFrame(pd.Series([np.array([1.2])]))
df
0
0 [1.2]
Run Code Online (Sandbox Code Playgroud)
我尝试过同样的事情:
df.astype(float)
0
0 1.2
Run Code Online (Sandbox Code Playgroud)
它很乐意做一些事情并将我的1长度数组转换为标量.这感觉很脏!
相反,他们不是一个长度的数组
df = pd.DataFrame(pd.Series([np.array([1.2, 1.3])]))
df
0
0 [1.2, 1.3]
Run Code Online (Sandbox Code Playgroud)
然后就打破了
Run Code Online (Sandbox Code Playgroud)ValueError: setting an array element with a sequence.
问题
请告诉我这是一个错误,我们可以解决它.或者有人可以解释为什么以及在哪个世界中这是有意义的?
对@root的回应
你是对的.这值得成为问题吗?你期望/想要这个吗?
a = np.empty((1,), object)
a[0] = np.array([1.2])
a.astype(float)
array([ 1.2])
Run Code Online (Sandbox Code Playgroud)
和
a = np.empty((1,), object)
a[0] = np.array([1.2, 1.3])
a.astype(float)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)ValueError: setting an array element with a sequence.
这是由于参数的unsafe
默认值造成的。在文档中的论点casting
astype
casting
是这样描述的:
“控制可能发生的数据类型转换。默认为 \xe2\x80\x98unsafe\xe2\x80\x99 以实现向后兼容性。 ”(我的重点)
\n\n任何其他可能的铸造都会返回TypeError
.
a = np.empty((1,), object)\na[0] = np.array([1.2])\na.astype(float, casting=\'same_kind\')\n
Run Code Online (Sandbox Code Playgroud)\n\n结果是:
\n\nTypeError: Cannot cast array from dtype(\'O\') to dtype(\'float64\') according to the rule \'same_kind\'\n
Run Code Online (Sandbox Code Playgroud)\n\n这适用于除 之外的所有铸件unsafe
,即:no
、equiv
、safe
和same_kind
。