MCPcopy Create free account
hub / github.com/apache/arrow / NdarraysToSparseCSFTensor

Function NdarraysToSparseCSFTensor

python/pyarrow/src/arrow/python/numpy_convert.cc:472–524  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

470}
471
472Status NdarraysToSparseCSFTensor(MemoryPool* pool, PyObject* data_ao, PyObject* indptr_ao,
473 PyObject* indices_ao, const std::vector<int64_t>& shape,
474 const std::vector<int64_t>& axis_order,
475 const std::vector<std::string>& dim_names,
476 std::shared_ptr<SparseCSFTensor>* out) {
477 if (!PyArray_Check(data_ao)) {
478 return Status::TypeError("Did not pass ndarray object for data");
479 }
480 const int ndim = static_cast<const int>(shape.size());
481 PyArrayObject* ndarray_data = reinterpret_cast<PyArrayObject*>(data_ao);
482 std::shared_ptr<Buffer> data = std::make_shared<NumPyBuffer>(data_ao);
483 ARROW_ASSIGN_OR_RAISE(
484 auto type_data,
485 GetTensorType(reinterpret_cast<PyObject*>(PyArray_DESCR(ndarray_data))));
486
487 std::vector<std::shared_ptr<Tensor>> indptr(ndim - 1);
488 std::vector<std::shared_ptr<Tensor>> indices(ndim);
489
490 for (int i = 0; i < ndim - 1; ++i) {
491#ifdef Py_GIL_DISABLED
492 PyObject* item = PySequence_ITEM(indptr_ao, i);
493 RETURN_IF_PYERROR();
494 OwnedRef item_ref(item);
495#else
496 PyObject* item = PySequence_Fast_GET_ITEM(indptr_ao, i);
497#endif
498 if (!PyArray_Check(item)) {
499 return Status::TypeError("Did not pass ndarray object for indptr");
500 }
501 RETURN_NOT_OK(NdarrayToTensor(pool, item, {}, &indptr[i]));
502 ARROW_CHECK_EQ(indptr[i]->type_id(), Type::INT64); // Should be ensured by caller
503 }
504
505 for (int i = 0; i < ndim; ++i) {
506#ifdef Py_GIL_DISABLED
507 PyObject* item = PySequence_ITEM(indices_ao, i);
508 RETURN_IF_PYERROR();
509 OwnedRef item_ref(item);
510#else
511 PyObject* item = PySequence_Fast_GET_ITEM(indices_ao, i);
512#endif
513 if (!PyArray_Check(item)) {
514 return Status::TypeError("Did not pass ndarray object for indices");
515 }
516 RETURN_NOT_OK(NdarrayToTensor(pool, item, {}, &indices[i]));
517 ARROW_CHECK_EQ(indices[i]->type_id(), Type::INT64); // Should be ensured by caller
518 }
519
520 auto sparse_index = std::make_shared<SparseCSFIndex>(indptr, indices, axis_order);
521 *out = std::make_shared<SparseTensorImpl<SparseCSFIndex>>(sparse_index, type_data, data,
522 shape, dim_names);
523 return Status::OK();
524}
525
526Status NdarraysToSparseCSRMatrix(MemoryPool* pool, PyObject* data_ao, PyObject* indptr_ao,
527 PyObject* indices_ao, const std::vector<int64_t>& shape,

Callers

nothing calls this directly

Calls 5

NdarrayToTensorFunction · 0.85
TypeErrorFunction · 0.50
OKFunction · 0.50
sizeMethod · 0.45
type_idMethod · 0.45

Tested by

no test coverage detected