0

我正在尝试在结构化 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.])

但我需要得到整个数组。除了逐列或不一起使用结构化数组之外,还有其他方法吗?

4

1 回答 1

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')])

我并不认为这是一个很好的解决方案,但它应该可以帮助您继续您的项目,直到提出更好的方案

于 2019-04-04T19:50:21.550 回答