diff --git a/axelrod/result_set.py b/axelrod/result_set.py
index 6ec59ae6..0a8b4fb2 100644
--- a/axelrod/result_set.py
+++ b/axelrod/result_set.py
@@ -464,28 +464,8 @@ class ResultSet(object):
             Where pij is the mean difference of the
             scores per turn between player i and j in repetition m.
         """
-        plist = list(range(self.nplayers))
-        payoff_diffs_means = [[0 for opponent in plist] for player in plist]
-
-        for player in plist:
-            for opponent in plist:
-                diffs = []
-                for index_pair, repetitions in self.interactions.items():
-                    if (player, opponent) == index_pair:
-                        for interaction in repetitions:
-                            scores = iu.compute_final_score_per_turn(interaction,
-                                                                     self.game)
-                            diffs.append(scores[0] - scores[1])
-                    elif (opponent, player) == index_pair:
-                        for interaction in repetitions:
-                            scores = iu.compute_final_score_per_turn(interaction,
-                                                                    self.game)
-                            diffs.append(scores[1] - scores[0])
-                if diffs:
-                    payoff_diffs_means[player][opponent] = mean(diffs)
-                else:
-                    payoff_diffs_means[player][opponent] = 0
-
+        payoff_diffs_means = [[mean(diff) for diff in player]
+                              for player in self.score_diffs]
         return payoff_diffs_means
 
     @update_progress_bar

Error in payoff_diffs_means?
I think there's a bug for self interactions for the payoff_diffs_means (this only affects stochastic strategies):

```
>>> import axelrod as axl
>>> from numpy import mean
>>> axl.seed(0)
>>> players = [s() for s in axl.demo_strategies]
>>> tournament = axl.Tournament(players, repetitions=2, turns=5)
>>> results = tournament.play()
>>> results.score_diffs
[[[0.0, 0.0],
  [-5.0, -5.0],
  [0.0, 0.0],
  [0.0, 0.0],
  [-3.0, -1.9999999999999998]],
 [[5.0, 5.0], [0.0, 0.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]],
 [[0.0, 0.0], [-1.0, -1.0], [0.0, 0.0], [0.0, 0.0], [0.0, -1.0]],
 [[0.0, 0.0], [-1.0, -1.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]],
 [[3.0, 1.9999999999999998], [-1.0, -1.0], [0.0, 1.0], [0.0, 0.0], [2.0, 0.0]]]
```

If you look at the last element we see that over the two repetitions, the Random strategy scored 2 and 0 against itself (both positive numbers).

```
>>> results.payoff_diffs_means
[[0.0, -5.0, 0.0, 0.0, -2.5],
 [5.0, 0.0, 1.0, 1.0, 1.0],
 [0.0, -1.0, 0.0, 0.0, -0.5],
 [0.0, -1.0, 0.0, 0.0, 0.0],
 [2.5, -1.0, 0.5, 0.0, -1.0]]
```

That last mean is `-1.0` which is just the opposite mean (this is due to how the self interactions are handled and the fact that `build_payoff_diffs_means` rebuilds the payoff diff means from the interactions. A more direct calculation gives:

```
>>> [[mean(diff) for diff in player] for player in results.score_diffs]
[[0.0, -5.0, 0.0, 0.0, -2.5],
 [5.0, 0.0, 1.0, 1.0, 1.0],
 [0.0, -1.0, 0.0, 0.0, -0.5],
 [0.0, -1.0, 0.0, 0.0, 0.0],
 [2.5, -1.0, 0.5, 0.0, 1.0]]
```

which is the expected result. Just about to push a PR fix that replaces `build_payoff_diffs_means` with this.
diff --git a/axelrod/tests/unit/test_resultset.py b/axelrod/tests/unit/test_resultset.py
index 5a81687b..dccd3e8f 100644
--- a/axelrod/tests/unit/test_resultset.py
+++ b/axelrod/tests/unit/test_resultset.py
@@ -364,6 +364,14 @@ class TestResultSet(unittest.TestCase):
         for j, rate in enumerate(rs.eigenmoses_rating):
             self.assertAlmostEqual(rate, self.expected_eigenmoses_rating[j])
 
+    def test_self_interaction_for_random_strategies(self):
+        # Based on https://github.com/Axelrod-Python/Axelrod/issues/670
+        axelrod.seed(0)
+        players = [s() for s in axelrod.demo_strategies]
+        tournament = axelrod.Tournament(players, repetitions=2, turns=5)
+        results = tournament.play()
+        self.assertEqual(results.payoff_diffs_means[-1][-1], 1.0)
+
 
 class TestResultSetFromFile(unittest.TestCase):
     tmp_file = tempfile.NamedTemporaryFile(mode='w', delete=False)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest numpy>=1.16.0 pandas>=1.0.0
apt-get update apt-get install -y libfreetype6-dev libpng-dev
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==25.3.0
-e git+https://github.com/Axelrod-Python/Axelrod.git@46ad8990affd6b9a792c84af4cc0987670cd515a#egg=Axelrod
cycler==0.12.1
exceptiongroup==1.2.2
hypothesis==6.130.5
iniconfig==2.1.0
kiwisolver==1.4.7
matplotlib==3.3.4
numpy==2.0.2
packaging==24.2
pandas==2.2.3
pillow==11.1.0
pluggy==1.5.0
pyparsing==2.1.1
pytest==8.3.5
python-dateutil==2.9.0.post0
pytz==2025.2
six==1.17.0
sortedcontainers==2.4.0
tomli==2.2.1
tqdm==3.4.0
tzdata==2025.2

name: Axelrod
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==25.3.0
      - cycler==0.12.1
      - exceptiongroup==1.2.2
      - hypothesis==6.130.5
      - iniconfig==2.1.0
      - kiwisolver==1.4.7
      - matplotlib==3.3.4
      - numpy==2.0.2
      - packaging==24.2
      - pandas==2.2.3
      - pillow==11.1.0
      - pluggy==1.5.0
      - pyparsing==2.1.1
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - six==1.17.0
      - sortedcontainers==2.4.0
      - tomli==2.2.1
      - tqdm==3.4.0
      - tzdata==2025.2
prefix: /opt/conda/envs/Axelrod

axelrod/tests/unit/test_resultset.py::TestResultSet::test_self_interaction_for_random_strategies axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_self_interaction_for_random_strategies axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_self_interaction_for_random_strategies axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_self_interaction_for_random_strategies
axelrod/tests/unit/test_resultset.py::TestResultSet::test_cooperating_rating axelrod/tests/unit/test_resultset.py::TestResultSet::test_cooperation axelrod/tests/unit/test_resultset.py::TestResultSet::test_eigenjesus_rating axelrod/tests/unit/test_resultset.py::TestResultSet::test_eigenmoses_rating axelrod/tests/unit/test_resultset.py::TestResultSet::test_good_partner_matrix axelrod/tests/unit/test_resultset.py::TestResultSet::test_good_partner_rating axelrod/tests/unit/test_resultset.py::TestResultSet::test_init axelrod/tests/unit/test_resultset.py::TestResultSet::test_init_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSet::test_match_lengths axelrod/tests/unit/test_resultset.py::TestResultSet::test_normalised_cooperation axelrod/tests/unit/test_resultset.py::TestResultSet::test_normalised_scores axelrod/tests/unit/test_resultset.py::TestResultSet::test_null_results_matrix axelrod/tests/unit/test_resultset.py::TestResultSet::test_payoff_diffs_means axelrod/tests/unit/test_resultset.py::TestResultSet::test_payoff_matrix axelrod/tests/unit/test_resultset.py::TestResultSet::test_payoff_stddevs axelrod/tests/unit/test_resultset.py::TestResultSet::test_payoffs axelrod/tests/unit/test_resultset.py::TestResultSet::test_ranked_names axelrod/tests/unit/test_resultset.py::TestResultSet::test_ranking axelrod/tests/unit/test_resultset.py::TestResultSet::test_score_diffs axelrod/tests/unit/test_resultset.py::TestResultSet::test_scores axelrod/tests/unit/test_resultset.py::TestResultSet::test_scores_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSet::test_vengeful_cooperation axelrod/tests/unit/test_resultset.py::TestResultSet::test_wins axelrod/tests/unit/test_resultset.py::TestResultSet::test_with_progress_bar axelrod/tests/unit/test_resultset.py::TestResultSetFromFile::test_init axelrod/tests/unit/test_resultset.py::TestResultSetFromFile::test_init_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSetFromFile::test_progres_bar axelrod/tests/unit/test_resultset.py::TestDecorator::test_update_progress_bar axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_cooperating_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_eigenjesus_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_eigenmoses_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_good_partner_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_good_partner_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_init axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_init_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_match_lengths axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_normalised_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_normalised_scores axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_null_results_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_payoff_diffs_means axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_payoff_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_payoff_stddevs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_payoffs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_ranked_names axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_ranking axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_score_diffs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_scores axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_scores_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_vengeful_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_wins axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructure::test_with_progress_bar axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_cooperating_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_eigenjesus_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_eigenmoses_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_good_partner_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_good_partner_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_init axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_init_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_match_lengths axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_normalised_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_normalised_scores axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_null_results_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_payoff_diffs_means axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_payoff_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_payoff_stddevs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_payoffs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_ranked_names axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_ranking axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_score_diffs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_scores axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_scores_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_vengeful_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_wins axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureTwo::test_with_progress_bar axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_cooperating_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_eigenjesus_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_eigenmoses_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_good_partner_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_good_partner_rating axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_init axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_init_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_match_lengths axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_normalised_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_normalised_scores axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_null_results_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_payoff_diffs_means axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_payoff_matrix axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_payoff_stddevs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_payoffs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_ranked_names axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_ranking axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_score_diffs axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_scores axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_scores_with_different_game axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_vengeful_cooperation axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_wins axelrod/tests/unit/test_resultset.py::TestResultSetSpatialStructureThree::test_with_progress_bar
axelrod/result_set.py
axelrod/result_set.py