numpy 数组变成标量


def calculate_coverage(line_layout):
    wfugai = 0
    w=[]
    for i in range(len(line_layout) - 1):
        d = np.abs(np.diff(line_layout))
        d0 = 110 + line_layout[i] * np.tan(alpha)
        d1 = d0 - d * math.tan(alpha)
        w1 = (d0 * math.sin(theta / 2)) / math.sin((math.pi - theta) / 2 + alpha)
        w2 = (d1 * math.sin(theta / 2)) / math.sin((math.pi - theta) / 2 - alpha)
        w3 = d / math.cos(alpha)
        w.append((d0 * math.sin(theta / 2)) / (math.sin((math.pi - theta) / 2 + alpha)) + (d1 * math.sin(theta / 2)) / (math.sin((math.pi - theta) / 2 - alpha)) - d / math.cos(alpha))

        if int(w[i]) < 0:
            wfugai += np.abs(w[i])
    return (width-wfugai) / width

```python
if int(w[i]) < 0:
wfugai += np.abs(w[i])

```一直报错 if int(w[i]) < 0:
TypeError: only size-1 arrays can be converted to Python scalars
有没有什么解决办法

错误意思是只有大小为1的数组可以转换为Python标量(scalar)。

import numpy as np
def calculate_coverage(line_layout):
    wfugai = 0
    w=[]
    line_layout = np.array(line_layout) 
    for i in range(len(line_layout) - 1):
        d = np.abs(np.diff(line_layout))
        d0 = 110 + line_layout[i] * np.tan(alpha)
        d1 = d0 - d * np.tan(alpha) 
        w1 = (d0 * np.sin(theta / 2)) / np.sin((np.pi - theta) / 2 + alpha) 
        w2 = (d1 * np.sin(theta / 2)) / np.sin((np.pi - theta) / 2 - alpha) 
        w3 = d / np.cos(alpha) 
        w.append((d0 * np.sin(theta / 2)) / (np.sin((np.pi - theta) / 2 + alpha)) + (d1 * np.sin(theta / 2)) / (np.sin((np.pi - theta) / 2 - alpha)) - d / np.cos(alpha))
        if int(w[i]) < 0:
            wfugai += np.abs(w[i])
    return (width-wfugai) / width

【以下回答由 GPT 生成】

问题的报错是因为在判断if int(w[i]) < 0:时,将一个numpy数组转换为标量出错。这是因为w是一个包含多个元素的numpy数组,不能直接将其转换为标量。

为了解决这个问题,我们可以使用numpy提供的函数来遍历数组,而不是使用python的内置range()函数。这样可以直接对numpy数组进行判断,而无需将其转换为标量。

下面是修改后的代码段:

def calculate_coverage(line_layout):
    wfugai = 0
    w=[]
    d = np.abs(np.diff(line_layout))
    d0 = 110 + line_layout * np.tan(alpha)
    d1 = d0 - d * math.tan(alpha)
    w1 = (d0 * math.sin(theta / 2)) / math.sin((math.pi - theta) / 2 + alpha)
    w2 = (d1 * math.sin(theta / 2)) / math.sin((math.pi - theta) / 2 - alpha)
    w3 = d / math.cos(alpha)
    w = (d0 * math.sin(theta / 2)) / (math.sin((math.pi - theta) / 2 + alpha)) + (d1 * math.sin(theta / 2)) / (math.sin((math.pi - theta) / 2 - alpha)) - d / math.cos(alpha)

    if np.any(w < 0):
        wfugai += np.sum(np.abs(w[w < 0]))

    return (width-wfugai) / width

请注意,我还删除了循环中的for语句,因为您没有使用i变量。如果有其他用途,您可以重新添加。我还将计算结果直接赋值给w,而不是将其添加到列表中。最后,我改用np.any()np.sum()函数来进行条件判断和求和。

请记得在函数之前定义alphathetawidth等变量,并正确导入numpymath模块。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^