Skip to content

Commit 6201e8b

Browse files
committed
Review feedback
1 parent aaa4987 commit 6201e8b

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

cpp/src/arrow/sparse_tensor_test.cc

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1676,4 +1676,55 @@ TEST(TestSparseCSFMatrixForUInt64Index, Make) {
16761676
ASSERT_RAISES(Invalid, SparseCSFTensor::Make(dense_tensor, uint64()));
16771677
}
16781678

1679+
//-----------------------------------------------------------------------------
1680+
// Create SparseTensors from a dense Tensor with only zeros
1681+
1682+
template <typename SparseTensorType>
1683+
class TestSparseTensorFromDenseBase : public ::testing::Test {
1684+
public:
1685+
void SetUp() {
1686+
shape_ = {2, 12};
1687+
dim_names_ = {"foo", "bar"};
1688+
dense_values_ = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1689+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1690+
dense_data_ = Buffer::Wrap(dense_values_);
1691+
}
1692+
1693+
protected:
1694+
std::vector<int64_t> shape_;
1695+
std::vector<std::string> dim_names_;
1696+
std::vector<int64_t> dense_values_;
1697+
std::shared_ptr<Buffer> dense_data_;
1698+
};
1699+
1700+
template <typename SparseTensorType>
1701+
class TestSparseTensorFromDense : public TestSparseTensorFromDenseBase<SparseTensorType> {
1702+
};
1703+
1704+
TYPED_TEST_SUITE_P(TestSparseTensorFromDense);
1705+
1706+
TYPED_TEST_P(TestSparseTensorFromDense, TestNonZeroLength) {
1707+
using SparseTensorType = TypeParam;
1708+
1709+
NumericTensor<Int64Type> dense_tensor_ =
1710+
NumericTensor<Int64Type>(this->dense_data_, this->shape_, {}, this->dim_names_);
1711+
ASSERT_OK_AND_ASSIGN(
1712+
auto sparse_tensor_,
1713+
SparseTensorType::Make(dense_tensor_, TypeTraits<Int64Type>::type_singleton()));
1714+
ASSERT_EQ(sparse_tensor_->non_zero_length(), 0);
1715+
ASSERT_EQ(sparse_tensor_->shape(), this->shape_);
1716+
ASSERT_EQ(sparse_tensor_->dim_names(), this->dim_names_);
1717+
}
1718+
1719+
REGISTER_TYPED_TEST_SUITE_P(TestSparseTensorFromDense, TestNonZeroLength);
1720+
1721+
INSTANTIATE_TYPED_TEST_SUITE_P(TestSparseCOOTensor, TestSparseTensorFromDense,
1722+
SparseCOOTensor);
1723+
INSTANTIATE_TYPED_TEST_SUITE_P(TestSparseCSRMatrix, TestSparseTensorFromDense,
1724+
SparseCSRMatrix);
1725+
INSTANTIATE_TYPED_TEST_SUITE_P(TestSparseCSCMatrix, TestSparseTensorFromDense,
1726+
SparseCSCMatrix);
1727+
INSTANTIATE_TYPED_TEST_SUITE_P(TestSparseCSFTensor, TestSparseTensorFromDense,
1728+
SparseCSFTensor);
1729+
16791730
} // namespace arrow

python/pyarrow/tests/test_sparse_tensor.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
except ImportError:
3434
sparse = None
3535

36-
3736
tensor_type_pairs = [
3837
('i1', pa.int8()),
3938
('i2', pa.int16()),
@@ -444,6 +443,8 @@ def test_sparse_coo_tensor_scipy_roundtrip(dtype_str, arrow_type):
444443
assert sparse_tensor.has_canonical_format
445444
assert out_scipy_matrix.has_canonical_format
446445

446+
assert scipy_matrix.nnz == 0
447+
assert scipy_matrix.nnz == sparse_tensor.non_zero_length
447448
assert np.array_equal(scipy_matrix.data, out_scipy_matrix.data)
448449
assert np.array_equal(scipy_matrix.row, out_scipy_matrix.row)
449450
assert np.array_equal(scipy_matrix.col, out_scipy_matrix.col)
@@ -479,6 +480,19 @@ def test_sparse_csr_matrix_scipy_roundtrip(dtype_str, arrow_type):
479480
dense_array = sparse_array.toarray()
480481
assert np.array_equal(dense_array, sparse_tensor.to_tensor().to_numpy())
481482

483+
scipy_matrix = csr_matrix([[0, 0], [0, 0]])
484+
sparse_tensor = pa.SparseCSRMatrix.from_scipy(scipy_matrix,
485+
dim_names=dim_names)
486+
out_scipy_matrix = sparse_tensor.to_scipy()
487+
dense_array = scipy_matrix.toarray()
488+
489+
assert scipy_matrix.nnz == 0
490+
assert scipy_matrix.nnz == sparse_tensor.non_zero_length
491+
assert np.array_equal(scipy_matrix.data, out_scipy_matrix.data)
492+
assert np.array_equal(scipy_matrix.indptr, out_scipy_matrix.indptr)
493+
assert np.array_equal(scipy_matrix.indices, out_scipy_matrix.indices)
494+
assert np.array_equal(dense_array, sparse_tensor.to_tensor().to_numpy())
495+
482496

483497
@pytest.mark.skipif(not sparse, reason="requires pydata/sparse")
484498
@pytest.mark.parametrize('dtype_str,arrow_type', tensor_type_pairs)
@@ -504,3 +518,16 @@ def test_pydata_sparse_sparse_coo_tensor_roundtrip(dtype_str, arrow_type):
504518
assert np.array_equal(sparse_array.coords, out_sparse_array.coords)
505519
assert np.array_equal(sparse_array.todense(),
506520
sparse_tensor.to_tensor().to_numpy())
521+
522+
sparse_array = sparse.COO.from_numpy([[0, 0], [0, 0]])
523+
sparse_tensor = pa.SparseCOOTensor.from_pydata_sparse(sparse_array,
524+
dim_names=dim_names)
525+
out_sparse_array = sparse_tensor.to_pydata_sparse()
526+
dense_array = sparse_array.todense()
527+
528+
assert sparse_array.nnz == 0
529+
assert sparse_array.nnz == sparse_tensor.non_zero_length
530+
assert out_sparse_array.nnz == sparse_tensor.non_zero_length
531+
assert np.array_equal(sparse_array.data, out_sparse_array.data)
532+
assert np.array_equal(sparse_array.coords, out_sparse_array.coords)
533+
assert np.array_equal(dense_array, sparse_tensor.to_tensor().to_numpy())

0 commit comments

Comments
 (0)