code: def test_whiten_zero_std(self, xp):
      desired = xp.asarray(
          [
              [0.0, 1.0, 2.86666544],
              [0.0, 1.0, 1.32460034],
              [0.0, 1.0, 3.74382172],
          ]
      )
  
      obs = xp.asarray(
          [
              [0.0, 1.0, 0.74109533],
              [0.0, 1.0, 0.34243798],
              [0.0, 1.0, 0.96785929],
          ]
      )
      with warnings.catch_warnings(record=True) as w:
          warnings.simplefilter("always")
  
          xp_assert_close(whiten(obs), desired, rtol=1e-5)
  
          assert_equal(len(w), 1)
          assert_(issubclass(w[-1].category, RuntimeWarning))
  
imports: import warnings
  import sys
  import numpy
  from numpy.testing import assert_array_equal, assert_allclose, assert_equal, assert_, suppress_warnings
  import pytest
  from pytest import raises
  from scipy.cluster.vq import kmeans, kmeans2, py_vq, vq, whiten, ClusterError, _krandinit
  from scipy.cluster import _vq
  from scipy.conftest import array_api_compatible, skip_if_array_api, skip_if_array_api_gpu
  from scipy.sparse._sputils import matrix
  from scipy._lib._array_api import SCIPY_ARRAY_API, copy, cov, xp_assert_close, xp_assert_equal
label_desc: Use image node_id 2 for calling the TestWhiten obj's underlying member method code with example usage: obj.test_whiten_zero_std(xp) without return types