我正在尝试在结构化的numpy数组上使用np.ceil函数,但我得到的只是错误消息:
TypeError: ufunc 'ceil' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
这是该数组的简单示例:
arr = np.array([(1.4,2.3), (3.2,4.1)], dtype=[("x", "<f8"), ("y", "<f8")])
当我尝试
np.ceil(arr)
我收到上述错误。当我只使用一列时,它会起作用:
In [77]: np.ceil(arr["x"])
Out[77]: array([ 2., 4.])
但是我需要获取整个数组。除了逐列或不一起使用结构化数组,还有其他方法吗?
答案 0 :(得分:0)
这是一个肮脏的解决方案,它是在没有结构的情况下查看阵列,取下上限,然后将其转换回结构化的阵列。
# sample array
arr = np.array([(1.4,2.3), (3.2,4.1)], dtype = [("x", "<f8"), ("y", "<f8")])
# remove struct and take the ceiling
arr1 = np.ceil(arr.view((float, len(arr.dtype.names))))
# coerce it back into the struct
arr = np.array(list(tuple(t) for t in arr1), dtype = arr.dtype)
# kill the intermediate copy
del arr1
在这里它是一种难以理解的单行代码,但没有分配中间副本arr1
arr = np.array(
list(tuple(t) for t in np.ceil(arr.view((float, len(arr.dtype.names))))),
dtype = arr.dtype
)
# array([(2., 3.), (4., 5.)], dtype=[('x', '<f8'), ('y', '<f8')])
我并不是说这是一个很好的解决方案,但是它应该可以帮助您继续进行项目,直到提出更好的建议为止