numpy 使用scikit-learn knn.predict,ndarray不是C连续的

hzbexzde  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(111)

我尝试调用预测函数,以便我有以下代码

def convert_to_df(obj):
    obj_dic = obj.dict()
    df = pd.DataFrame(obj_dic.values(), index=obj_dic.keys())
    df.reset_index(drop=True, inplace=True)
    return df

@app.get("/get_rating")
def get_rating(features: Features):
    features = convert_to_df(features).T # shape (1, 26)
    return {'rating': Predictor().predict(features)}

但我得到了以下错误:
File“stringsource”,line 658,in View.MemoryView.memoryview_cwrapper File“stringsource”,line 349,in View. memoryView. memoryview.cinitValueError:ndarray不是C连续的
我该如何解决这个问题?
谢谢

编辑

Predictor是一个带有scikit learn的knn模型训练器

def predict(self, features) -> int:
    return self.model.predict(features)
c8ib6hqw

c8ib6hqw1#

数据量和回溯信息仍然不够。不过,我猜猜看。
让我们做一个简单的框架:

In [31]: df = pd.DataFrame(np.ones((3,4)))

In [32]: df
Out[32]: 
     0    1    2    3
0  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0
2  1.0  1.0  1.0  1.0

predict可能使用了一些需要c-contiguous数据的编译代码。如果给定一个数组,它可能首先将其转换为数组,例如使用np.array(df)或有效地:

In [35]: df.values
Out[35]: 
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

In [36]: df.values.flags
Out[36]: 
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

但是如果你转置,邻接性就改变了。这是众所周知的数组,看起来pandas是兼容的:

In [37]: df.T.values.flags
Out[37]: 
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

pandastranspose允许我们指定copy -参见其文档:

In [38]: df.transpose(copy=True).values.flags
Out[38]: 
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

所以在代码中使用(?解决问题:

features = convert_to_df(features).transpose(copy=True)

我再怎么强调也不为过,你应该在你的问题中包括足够的信息。

0x6upsns

0x6upsns2#

即使所有列都独立地> C_CONTIGUOUS:真

# his solution worked for me
X, y = np.ascontiguousarray(df[required_cols]), df['labeled']

分配时

相关问题