You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by uw...@apache.org on 2018/03/06 19:20:39 UTC
[arrow] branch master updated: ARROW-2154: [Python] Implement
equality on buffers
This is an automated email from the ASF dual-hosted git repository.
uwe pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new 51e117d ARROW-2154: [Python] Implement equality on buffers
51e117d is described below
commit 51e117d31ef4e3bf26abf3c4af71ca723de13d5c
Author: Antoine Pitrou <an...@python.org>
AuthorDate: Tue Mar 6 20:20:33 2018 +0100
ARROW-2154: [Python] Implement equality on buffers
And also on tensors.
Author: Antoine Pitrou <an...@python.org>
Closes #1716 from pitrou/ARROW-2154-buffer-equality and squashes the following commits:
b568123 <Antoine Pitrou> ARROW-2154: Implement equality on buffers
---
python/pyarrow/array.pxi | 10 ++++++++--
python/pyarrow/io.pxi | 6 ++++++
python/pyarrow/tests/test_io.py | 26 +++++++++++++++++++++-----
python/pyarrow/tests/test_tensor.py | 24 ++++++++++++++++++++----
4 files changed, 55 insertions(+), 11 deletions(-)
diff --git a/python/pyarrow/array.pxi b/python/pyarrow/array.pxi
index d4e53ec..7899d9d 100644
--- a/python/pyarrow/array.pxi
+++ b/python/pyarrow/array.pxi
@@ -541,6 +541,12 @@ strides: {0.strides}""".format(self)
self._validate()
return self.tp.Equals(deref(other.tp))
+ def __eq__(self, other):
+ if isinstance(other, Tensor):
+ return self.equals(other)
+ else:
+ return NotImplemented
+
@property
def is_mutable(self):
self._validate()
@@ -565,12 +571,12 @@ strides: {0.strides}""".format(self)
def shape(self):
# Cython knows how to convert a vector[T] to a Python list
self._validate()
- return self.tp.shape()
+ return tuple(self.tp.shape())
@property
def strides(self):
self._validate()
- return self.tp.strides()
+ return tuple(self.tp.strides())
cdef wrap_array_output(PyObject* output):
diff --git a/python/pyarrow/io.pxi b/python/pyarrow/io.pxi
index 5c8411b..611c8a8 100644
--- a/python/pyarrow/io.pxi
+++ b/python/pyarrow/io.pxi
@@ -671,6 +671,12 @@ cdef class Buffer:
result = self.buffer.get().Equals(deref(other.buffer.get()))
return result
+ def __eq__(self, other):
+ if isinstance(other, Buffer):
+ return self.equals(other)
+ else:
+ return NotImplemented
+
def to_pybytes(self):
self._check_nullptr()
return cp.PyBytes_FromStringAndSize(
diff --git a/python/pyarrow/tests/test_io.py b/python/pyarrow/tests/test_io.py
index 17aca43..e42914f 100644
--- a/python/pyarrow/tests/test_io.py
+++ b/python/pyarrow/tests/test_io.py
@@ -237,6 +237,16 @@ def test_buffer_from_numpy():
def test_buffer_equals():
# Buffer.equals() returns true iff the buffers have the same contents
+ def eq(a, b):
+ assert a.equals(b)
+ assert a == b
+ assert not (a != b)
+
+ def ne(a, b):
+ assert not a.equals(b)
+ assert not (a == b)
+ assert a != b
+
b1 = b'some data!'
b2 = bytearray(b1)
b3 = bytearray(b1)
@@ -246,12 +256,18 @@ def test_buffer_equals():
buf3 = pa.frombuffer(b2)
buf4 = pa.frombuffer(b3)
buf5 = pa.frombuffer(np.frombuffer(b2, dtype=np.int16))
- assert buf1.equals(buf1)
- assert buf1.equals(buf2)
- assert buf2.equals(buf3)
- assert not buf2.equals(buf4)
+ eq(buf1, buf1)
+ eq(buf1, buf2)
+ eq(buf2, buf3)
+ ne(buf2, buf4)
# Data type is indifferent
- assert buf2.equals(buf5)
+ eq(buf2, buf5)
+
+
+def test_buffer_hashing():
+ # Buffers are unhashable
+ with pytest.raises(TypeError, match="unhashable"):
+ hash(pa.frombuffer(b'123'))
def test_foreign_buffer():
diff --git a/python/pyarrow/tests/test_tensor.py b/python/pyarrow/tests/test_tensor.py
index 1d45dc7..093bc86 100644
--- a/python/pyarrow/tests/test_tensor.py
+++ b/python/pyarrow/tests/test_tensor.py
@@ -30,8 +30,8 @@ def test_tensor_attrs():
assert tensor.ndim == 2
assert tensor.size == 40
- assert tensor.shape == list(data.shape)
- assert tensor.strides == list(data.strides)
+ assert tensor.shape == data.shape
+ assert tensor.strides == data.strides
assert tensor.is_contiguous
assert tensor.is_mutable
@@ -121,14 +121,30 @@ def test_tensor_ipc_strided(tmpdir):
def test_tensor_equals():
+ def eq(a, b):
+ assert a.equals(b)
+ assert a == b
+ assert not (a != b)
+
+ def ne(a, b):
+ assert not a.equals(b)
+ assert not (a == b)
+ assert a != b
+
data = np.random.randn(10, 6, 4)[::, ::2, ::]
tensor1 = pa.Tensor.from_numpy(data)
tensor2 = pa.Tensor.from_numpy(np.ascontiguousarray(data))
- assert tensor1.equals(tensor2)
+ eq(tensor1, tensor2)
data = data.copy()
data[9, 0, 0] = 1.0
tensor2 = pa.Tensor.from_numpy(np.ascontiguousarray(data))
- assert not tensor1.equals(tensor2)
+ ne(tensor1, tensor2)
+
+
+def test_tensor_hashing():
+ # Tensors are unhashable
+ with pytest.raises(TypeError, match="unhashable"):
+ hash(pa.Tensor.from_numpy(np.arange(10)))
def test_tensor_size():
--
To stop receiving notification emails like this one, please contact
uwe@apache.org.